当前位置: 首页 > 知识库问答 >
问题:

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

韩宏朗
2023-03-14
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)方法所收到的后续事件。

我相信问题来自于这样一个事实,即我试图修改事件源,同时接收基于该源的某个特定状态生成的事件,但如果指示模式变化的任何事件与模型修改交织在一起,以及基于模型的旧状态生成的其他事件,那么这不也是一个问题吗?

我最终想要实现的是实现,它允许我根据表中某个列的值将行从一个表移动到另一个表。

假设其中一个单元格是一个组合框,有两个值,我们有两个表,当一个单元格中的值更改为table1,然后行从当前表转移到table1。我认为使用TableModelListener是一个合适的解决方案,但是我可以看到在这个方法中修改模型不是一个好主意,不是吗?

共有1个答案

江棋
2023-03-14
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()方法中,您将需要按照反向模型行顺序更新模型的数据。这样,当您删除行时,就不会出现索引不正确的问题。

 类似资料:
  • 问题内容: 我想知道与使用if语句先检查null相比,使用try / exception处理null的成本。 提供更多信息。因为在此应用程序中,有> 50%的机会获得空值。如果未输入任何数据,则通常为null。因此,尝试使用null进行计算是很平常的事。 话虽这么说,如果我先使用if语句在计算之前先检查null并且不首先尝试计算是否会提高性能,或者仅抛出异常并对其进行处理会更便宜? 感谢您的任何建

  • 您可以使用allowedKeys选项允许修饰键和{{action}}助手一起使用。 有时, {{action}}帮助器会使用按下的修改键来丢弃单击事件。 因此, allowedKeys选项指定不应忽略哪些键。 语法 (Syntax) <button {{action 'action-name' allowedKeys = "alt"}}></button> 例子 (Example) 下面给出的示

  • 问题内容: MySQL 5.0.45 更改表以允许列为空的语法是什么,或者这是怎么回事: 我将手册解释为仅运行上述内容,它将重新创建该列,这次允许为空。服务器告诉我我有语法错误。我只是看不到他们。 问题答案: 您需要以下内容: 列默认为空。只要未声明或列,就不会有任何问题。

  • 问题内容: 这是模块的模块声明: 因此,和之间存在循环依赖关系,对吗?平台模块之间是否允许循环? 问题答案: 模块系统禁止使用子句静态声明循环。对于平台和应用程序模块,这是正确的,并且您给出的示例不违反该规则。 不过,Requires子句只是模块图中可读性优势的一种来源。其他是命令行标志,反射,,我敢肯定还有更多。添加所有这些可能会导致模块图中的循环,并且这是不被禁止的。 在您的具体示例中,仅当

  • 在Java 8中,Stream有一个方法reduce: 累加器运算符是否允许修改其任一参数?我不这么认为,因为JavaDoc说累加器应该是非干涉的,尽管所有示例都谈到修改集合,而不是修改集合的元素。 举个具体的例子,如果我们有 假设整数是可变的,那么可以通过将第二个参数的值添加到第一个参数中(就地)来修改第一个参数吗? 我想不会,但我也想举一个例子,说明这种干扰在哪里会引起问题。

  • 问题内容: 如何使用T-SQL更改表中的一个属性以允许为null(不为null-> null)?也许更改表? 问题答案: