gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:57:26 25 4
gpt4 key购买 nike

我想知道如何实现这样的行为,当该行的特定列的值更改为某个固定值时,这将允许我从 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() 方法中,您将需要以相反的模型行顺序更新模型的数据。这样,当您删除行时,就不会出现索引不正确的问题。

关于java - 处理 TableModelEvent 时是否允许修改 JTable 的模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52119394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com