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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在处理TableModelEvent时是否允许修改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是合适的解决方案,但我可以看到在这个方法中修改模型不是一个好主意,不是吗?

答案
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()方法中,您需要以反向模型行顺序更新模型的数据。这样,当您删除行时,索引不正确就没有问题。

以上是关于在处理TableModelEvent时是否允许修改JTable的模型?的主要内容,如果未能解决你的问题,请参考以下文章

使用filesystemwatcher时怎么处理大文件

是否有一个 VBA 代码允许修改数字,同时在单元格中保持单词不变?

sqlserver设计视图修改表时不允许保存更改的问题处理

sqlserver设计视图修改表时不允许保存更改的问题处理

Maven+Jetty运行项目无法热修改html处理

编译器是不是允许修改填充字节