gpt4 book ai didi

java - 如何使用 fireTableDataChanged() 正确更新 AbstractTableModel?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:00:35 24 4
gpt4 key购买 nike

我是 still挣扎于JTable应该会自动更新。

情况如下:我实例化 MyTable (扩展 JTable ),并将其设置在我的 UI 类 ( MyView ) 中。 MyTable类将 UI 类和包含逻辑的类实例作为参数):

...
private JPanel createTablePanel() {
tablePanel = new JPanel();
myTable = new MyTable(this,mymeth);
setMyTable(myTable);
JScrollPane scrollPane = new JScrollPane(getMyTable());
tablePanel.add(scrollPane);
return tablePanel;
}

MyTable本身看起来像下面。 AbstractTableModel 的扩展( MyTableModel ) 设置为它。 TableModelListener 的扩展设置为模型。最后是 ListSelectionListener 的扩展设置为模型的 SelectionModel .

public class MyTable extends JTable implements TableModelListener
{

public MyTable(MyView myView, MyMethods mymeth)
{

AbstractTableModel tableModel = new MyTableModel(mymeth);
setModel(tableModel);
getModel().addTableModelListener(new MyTableModelListener());
setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
setCellSelectionEnabled(true);
getColumnModel().getSelectionModel().addListSelectionListener(new MyTableSelectionListener(this, mymeth, myView));
setPreferredScrollableViewportSize(this.getPreferredSize());

}

}

让我们快速浏览一下模型的构造函数。

public MyTableModel(MyMethods mymeth) {
dataObject = new MyData(mymeth);
myData = dataObject.getMyData();
colTitles = dataObject.getColTitles();
}

MyData编译表的数据:A Vector<Vector<Object>> , 由三个 Vector<Object> 组成s(表数据)和 String[] (列标题)。数据本身来自 mymeth 的图表。 , 逻辑类的实例。

每当单击表时,都会实例化一个弹出窗口(即 JOptionPane)对象,它会显示所选列中第 3 行的值选择。用户选择一个值并将该值设置为数据模型注意之后表格的更新方式。

public MyOptionPane(int i, MyMethods mymeth, MyView myView) {
this.view = myView;
String sourceString = mymeth.getSourceString(i); // Gets a String from a
String[]. In this Array, the order is the same as in the table.
String tag = null;
tag = (String) JOptionPane.showInputDialog(this, "Choose a tag for \"" + sourceString + "\"", "String tagging" , JOptionPane.PLAIN_MESSAGE, null, myView.getTags().toArray(), myView.getTags().get(0));
mymeth.setTag(i, tag);

// This is where fireTableDataChanged() didn't work, but this did
MyTableModel model = new MyTableModel(mymeth); // New model instance
view.getMyTable().setModel(model); // reset new model to table
}

这行得通。但是,从我读过的内容来看,我应该可以简单地调用 fireTableDataChanged()在模型和表格上应该会自行更新。但是,这不起作用。用户 kleopatra 有 commented上一篇文章的回答:

do not call any of the model's fireXX methods from any code external to the model. Instead implement the model to do so when anything changed

所以:我可以调用fireTableDataChanged()吗?完全在这样的结构中?如果是,在哪里以及如何?

在此先感谢您的所有启发!

最佳答案

from what I've read I shold be able to simply call fireTableDataChanged() on the model and the table should update itself

您的程序不会调用模型上的 fireXXX 方法。每当模型中的任何数据发生更改时,TableModel 本身负责调用这些方法。看Creating a Table Model Swing 教程中的示例。 setValueAt(...) 方法展示了如何调用适当的 fireXXX 方法。

如果您创建一个全新的 TableModel,那么您需要使用 setModel() 方法。

Kleopatra 的评论是,所有 fireXXX 方法都显示是从 TableModel 类本身内部调用的。如果您想了解这是如何完成的,请查看 DefaultTableModel 的源代码。如果有关于何时调用 fireTableDataChanged() 方法以及其他 fireXXX 方法的示例。

关于java - 如何使用 fireTableDataChanged() 正确更新 AbstractTableModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7904708/

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