最近遇到一个奇怪的问题。每当我尝试删除属于 DefaultTableModel 对象的 TableModelListener 中的行时,我都会收到 ArrayOutOfBounds Exception 0>=0, 1>=1(取决于我的选择)我在这里发现了类似的问题:
java.lang.ArrayIndexOutOfBoundsException: 0 >= 0 attempting to populate JTable
但是,仍然无法修复它。我的目的是当用户在组合框中选择删除选项时,我只想完全删除该行。顺便说一句,removeRow() 方法在监听器之外正常工作。这是代码和解释:
String[] columnNames = {"Kargo ID",
"Alıcı Adres",
"Ağırlık(KG)",
"Tutar(TL)",
"Alım Saati","Durum","İletim Saati"};
Object[][] data = {
{new Integer(3), "Sinan Caddesi",
new Integer(100), new Integer(5),"" ,"",""}};
final DefaultTableModel dtm = new DefaultTableModel(data,columnNames);
final JTable table = new JTable(dtm){
@Override
public boolean isCellEditable(int row, int column) {
return column == 5;//Combobox column
}
};
//Making Combobox
TableColumn c = table.getColumnModel().getColumn(5);
JComboBox comboBox = new JComboBox();
comboBox.addItem("");
comboBox.addItem("Delete");
c.setCellEditor(new DefaultCellEditor(comboBox));
//System.out.println(dtm.getRowCount());
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(false);
//I printed row and column numbers, they re correct.
dtm.addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
int row = e.getFirstRow();
int column = e.getColumn();
DefaultTableModel model = (DefaultTableModel)e.getSource();
Object data = model.getValueAt(row, column);
//System.out.println(data); DATA IS CORRECT
if(((String)data).equals("Delete"))
dtm.removeRow(row);//Exception Here
//System.out.println(row + " " + column);
}
});
我是否遗漏了一些重要的观点?任何帮助将不胜感激。
最佳答案
“非常”基本的想法是,当 TableModel#setValue
被调用时,您想要检查被修改的 column
。如果 column
是(在本例中)5
,您需要检查值是什么...
例如……
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
if (columnIndex == 5) {
if ("Delete".equals(aValue)) {
removeRow(rowIndex);
}
}
}
请记住,上面的示例覆盖了 setValueAt
的默认行为,因此如果您依赖模型中更新的值,则需要调用 super.setValueAt(.. .)
关于java - 从 DefaultTableModel 对象中删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20340588/