为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕容3067478 2021-08-25 09:50:18
我想知道如何实现这种行为,当该行的特定列中的值更改为某个固定值时,这将让我从 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 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

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


查看完整回答
反对 回复 2021-08-25
  • 1 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信