处理TableModelEvent时是否允许修改JTable模型?

时间:2018-08-31 16:19:33

标签: java swing jtable

我想知道如何实现这种行为,当该行的特定列的值更改为某个固定值时,该行为将允许我从JTable中删除行。

我尝试使用TableModelListener进行此操作,但是没有达到预期的效果。我的问题与以下事实有关:当我在处理UPDATE TableModelEvent的同时修改模型时,我谴责自己要处理事件本身可能修改的模型(事件源)之间的不一致。换句话说,可以根据表模型的不同状态生成事件。

void onTableChanged(TableModelEvent tableModelEvent)
{
    MyTableModel model = (MyTableModel)e.getSource();
    if ( e.getType() == TableModelEvent.UPDATE){
        MyObject myObject = (MyObject)model.getValueAt(e.getFirstRow(), e.getColumn());
        if ( myObject.getSomeProperty().equals("DELETE ME")){
          model.removeRow(e.getFirstRow()); // does it look like asking for troubles?
        }            
    }
}

现在想像一下,我们有一个方法可以让我们一次更新几行。

class MyObject {
    private String someProperty;

    //...getters/setters
}

class MyTableModel extends AbstractTableModel {
    private static int SOME_PROPERTY_COL = 1;     
    private final List<MyObject> data;

    public MyTableModel(List<MyObject> data)
    {
        this.data = data;
    }

    //...

    void update(int[] modelIndices, String newSomePropertValue)
    {
        for (int i = 0; i < modelIndices.length; i++){
            data[modelIndices[i]].setSomeProperty(newSomePropertyValue);
            fireCellUpdated(modelIndices[i], SOME_PROPERTY_COL);
        }
    }
}

TableModelEvent中的rowIndex,colIndex与第二秒时的模型状态之间的这种实现方式不一致,并且由于在MyTableModel对象上调用update(int [],String)方法而收到的后续事件之间存在不一致。

我认为问题出在以下事实:我尝试修改事件的来源,同时接收基于该来源的某些特定状态生成的事件,但也不会成为问题,例如,如果任何事件表明模式与模型修改交织在一起,还有其他事件是根据模型的旧状态生成的?

我最终要实现的实现是基于表中某一列的值,让我将行从一个表移动到另一个表。

因此,想象一个单元格是一个带有2个值的组合框,并且我们有两个表,当单元格中的值更改为table1时,行将从当前表转移到table1。我以为使用TableModelListener是合适的解决方案,但是我可以看到在此方法中修改模型不是一个好主意,不是吗?

1 个答案:

答案 0 :(得分:2)

model.removeRow(e.getFirstRow()); // does it look like asking for troubles?

将代码包装在SwingUtilities.invokeLater(...)中。

现在,代码将被添加到事件调度线程(EDT)的末尾,因此表处理和表模型侦听器处理可以在完成行删除之前正常完成。

SwingUtilities.invokeLater(new Runnable()
{
    public void run()
    {
        model.removeRow(e.getFirstRow());
    }
});

此外,在您的update()方法中,您将需要按照相反的模型行顺序更新模型的数据。这样,删除行时就不会出现索引不正确的问题。