【发布时间】:2013-12-18 21:16:47
【问题描述】:
最近我遇到了一个奇怪的问题。每当我尝试删除 TableModelListener 中属于 DefaultTableModel 对象的行时,我得到 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);
}
});
我错过了一些重要的点吗?任何帮助将不胜感激。
【问题讨论】:
-
使用
TableModelListener不是修改表模型的适当方法,因为当您修改表模型时,表模型将触发另一个表更改事件,依此类推...采取查看this example 以获得更好的想法 -
那么如何监听表中的数据变化呢?我已经尝试将 actionListener 添加到组合框而不是表,但结果是一样的。
-
监听更改和根据这些更改进行修改是两件不同的事情。看看链接的例子
标签: java swing jtable actionlistener