fireTableDataChanged() 问题
Issue with fireTableDataChanged()
我即将在 Java 中使用使用 JTable 的 Eclipse 创建一个程序。我所做的是创建 JTable,将其与扩展我称为 ResultsTableModel 的 AbstractTableModel 的 class 相关联,并创建一个名为 refresh 的方法,该方法使用 fireTableDataChanged() 方法。 class 看起来像这样:
public class ResultPanel extends JPanel {
ResultsTableModel rm;
JTable table;
public ResultPanel() {
rm = new ResultsTableModel();
table = new JTable();
setLayout(new BorderLayout());
add(new JScrollPane(table), BorderLayout.CENTER);
}
public void setData(List<Entry> entries) {
rm.setData(entries);
}
public void refresh() {
rm.fireTableDataChanged();
}
}
问题是当我 运行 程序在某个时候调用 refresh() 方法时, table 数据没有刷新,实际上 table 甚至根本没有显示。这是 class 我构建的 table 模型:
public class ResultsTableModel extends AbstractTableModel {
private List<Entry> entries = new ArrayList<Entry>();
private String[] colNames = {"STATUS", "ROOT", "DEFINITION"};
public void setData(List<Entry> list) {
this.entries = list;
}
@Override
public String getColumnName(int column) {
return colNames[column];
}
@Override
public int getColumnCount() {
return 3;
}
@Override
public int getRowCount() {
return entries.size();
}
@Override
public Object getValueAt(int arg0, int arg1) {
Entry entry = entries.get(arg0);
switch(arg1) {
case 0:
return entry.getStatus();
case 1:
return entry.getRoot();
case 2:
return entry.getDef();
default:
return "Invalid index";
}
}
}
这几乎是我能给出的关于我遇到的问题的最佳描述。程序没有抛出异常,只是没有显示 table 事件,尽管我调用了 setVisible(true);方法就可以了。任何帮助将不胜感激,谢谢。
您从未告诉 JTable 实际上包含创建的 TableModel。
您可以通过构造函数传递它:
rm = new ResultsTableModel();
table = new JTable(rm);
此外,我建议仅从您的 ResultsTableModel
class 中调用 fireTableDataChanged()
(例如,在 setData()
方法的末尾)而不是明确地从你的观点(JPanel)。
拥有 TableModel 的全部意义在于 separate 您从模型中看到的观点。
我即将在 Java 中使用使用 JTable 的 Eclipse 创建一个程序。我所做的是创建 JTable,将其与扩展我称为 ResultsTableModel 的 AbstractTableModel 的 class 相关联,并创建一个名为 refresh 的方法,该方法使用 fireTableDataChanged() 方法。 class 看起来像这样:
public class ResultPanel extends JPanel {
ResultsTableModel rm;
JTable table;
public ResultPanel() {
rm = new ResultsTableModel();
table = new JTable();
setLayout(new BorderLayout());
add(new JScrollPane(table), BorderLayout.CENTER);
}
public void setData(List<Entry> entries) {
rm.setData(entries);
}
public void refresh() {
rm.fireTableDataChanged();
}
}
问题是当我 运行 程序在某个时候调用 refresh() 方法时, table 数据没有刷新,实际上 table 甚至根本没有显示。这是 class 我构建的 table 模型:
public class ResultsTableModel extends AbstractTableModel {
private List<Entry> entries = new ArrayList<Entry>();
private String[] colNames = {"STATUS", "ROOT", "DEFINITION"};
public void setData(List<Entry> list) {
this.entries = list;
}
@Override
public String getColumnName(int column) {
return colNames[column];
}
@Override
public int getColumnCount() {
return 3;
}
@Override
public int getRowCount() {
return entries.size();
}
@Override
public Object getValueAt(int arg0, int arg1) {
Entry entry = entries.get(arg0);
switch(arg1) {
case 0:
return entry.getStatus();
case 1:
return entry.getRoot();
case 2:
return entry.getDef();
default:
return "Invalid index";
}
}
}
这几乎是我能给出的关于我遇到的问题的最佳描述。程序没有抛出异常,只是没有显示 table 事件,尽管我调用了 setVisible(true);方法就可以了。任何帮助将不胜感激,谢谢。
您从未告诉 JTable 实际上包含创建的 TableModel。
您可以通过构造函数传递它:
rm = new ResultsTableModel();
table = new JTable(rm);
此外,我建议仅从您的 ResultsTableModel
class 中调用 fireTableDataChanged()
(例如,在 setData()
方法的末尾)而不是明确地从你的观点(JPanel)。
拥有 TableModel 的全部意义在于 separate 您从模型中看到的观点。