- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我是 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/
添加一行并调用 fireTableRowInserted() 还是添加所有行然后调用 fireTableDataChanged() 是个好主意? 最佳答案 如果您所做的只是添加新行,最好添加所有行,然
我正在尝试用 VCID 和 VCIDBACKUP 的空值替换“Dont Have”。这是我的代码: if (controladorExcel == false) { Writa
我有这个表模型,并且我插入以这种方式调用的值: lista.setModel(new SimpleTableModel(dados, colunas)); lista 是 JTable 型号:
我的表格模型在更新其中打印的数据时遇到问题。 我有作为表模型的 AgendaTableModel 类和作为主 UI 的 Screen 类,当我按下“Listar Contatos”按钮时,表模型应该出
我正在开发一个小程序,它应该在 JTable 中显示食谱。一切似乎都工作正常,我遇到的唯一问题是我无法初始化应该正确保存数据的对象。这是让我头疼的类(class): class RecipeTable
我有一个类,它实际上是一些数据的列表,它扩展了AbstractTableModel。此类中的数据存储在线程安全的数组列表中。 但是,如果我想添加一些数据,可以说我在扩展 AbstractTableMo
我引用了很多方法。即fireTableCellUpdated 的有效方法。但其实我还是不申请。 DETA值更新后如何使表内容更新。 方法我调用GJJ方法实现。虽然更新了但是出现了很多新的窗口。这不是我
我找到的例子: http://www.java2s.com/Code/Java/Swing-Components/ButtonTableExample.htm显示如何创建具有指定列(按钮)的 JTab
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我有两个类。第一个类mainWindow扩展了JFrame,其中我有一个JTable table1。在我的第二堂课中,我需要拿到这张 table 。当我在 mainWindow 中生成 getter
在设置特定外观后序列化扩展 AbstractTableModel 的类会导致 java.io.NotSerializedException: com.sun.java.swing.plaf.windo
我有一个扩展 JTable 的类,我想将其设置为 AbstractTableModel,但我了解其可能性的唯一方法是调用 使用 super 的 JTable 构造函数。 但是,我需要在调用构造函数之前
我设法潜伏并找到一个可以替代的好类(class) JTable(Object[][] data, Object[] columnNames)与 RowTableModel(List modelData
嘿。我正在尝试使用 AbstractTableModel 构建一个简单的 JTable,但即使我使用了 JScrollPane,列名称也不会出现。 public class TableModel ex
我有一些数据从我的数据库加载并作为公共(public)静态列表存储在另一个类中,我无法访问 MyTableModel 类中的数据以在 jtable 中存储和查看它们...还有许多其他方法可以用我的数据
是否可以动态更改 AbstractTableModel 列名称? 我正在尝试实现setColumnName(0, "Speed rpm")方法。 public class MyModel extend
我想根据我使用 AbstractTableModel 指定的列从数据库的表中提取数据。表中有 8 列,但只想显示 8 列中的 3 列。 例如: 数据库具有以下列:ID、First_Name、Last_
我已经实现了一个 AbstractTableModel 对象,它是一种时间表。我想将当时将通过使用方法教授的主题写入单元格(因此我不想将行声明为已编译)。我能怎么做?这是我的 AbstractTabl
我正在尝试将 JTable(类型 AbstractTableModel)中编辑的行保存到文件中。我不知道该怎么做;或者可以使用 ObjectOutput 和 InputStream。 此外,我想在保存
我正在制作一个 Swing 项目。可能太大了,无法粘贴到这里。我什至尝试记录 table.getSelectedRow() 并且它显示了正确的索引。但不知何故,当我按下删除按钮时,这会导致在此类中调用
我是一名优秀的程序员,十分优秀!