【问题标题】:Can't get JTable to refresh/repaint a DefaultTableModel in same instance of GUI run无法让 JTable 在 GUI 运行的同一实例中刷新/重绘 DefaultTableModel
【发布时间】:2016-02-28 20:14:46
【问题描述】:

我根本无法让我的JTable 刷新我使用方法创建的新表模型。

我已经通过tablemodel.getDataVector()方法证明我的tablemodel更新正确了。

但是,我无法让我的JTable 刷新这个新事物的视图。

我的JTable 位于一个空布局窗格中,并且位于JScrollPane 内。

关于JTable的相关代码:

private JTable patientTable = new JTable(tablemodel);
      private JScrollPane patientscrollPane = new JScrollPane(patientTable);    
patientTable.setModel(tablemodel);
    patientTable.setFillsViewportHeight(true);
    sorter = new TableRowSorter<DefaultTableModel>(tablemodel);
    patientTable.setRowSorter(sorter);
    patientcard.add(patientscrollPane);

关于我试图重绘表格的相关代码:

tablemodel = controller.createModel(patientlist);      
      patientTable = new JTable(tablemodel);
      patientscrollPane = new JScrollPane(patientTable);
      patientTable.setModel(tablemodel);
      patientTable.setFillsViewportHeight(true);    
    patientTable.setPreferredScrollableViewportSize(patientTable.getPreferredSize());
       patientTable.validate();
       patientscrollPane.validate();
        patientTable.repaint();
       patientcard.setVisible(true);
       registrycard.setVisible(false);

有趣的是,当我调用 patientTable.getTableModel() 时,它不会返回 DefaultTableModel

【问题讨论】:

  • 过去,当我尝试从事件调度线程外部更新模型时,这通常发生在我身上。考虑提供一个runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个例子,它突出了您遇到的问题。这将减少混乱并获得更好的响应
  • 谢谢。我现在添加了一个我认为是可运行的示例,删除了很多代码行,并且患者只有 2 个字段(名字、姓氏)等。您也可以通过测试任何样本 CSV 来运行它有名字和姓氏。
  • @MadProgrammer 我现在更新更简单了,请看一下
  • 我还应该说,当我重新运行 GUI 时,新患者和新 JTable 会更新,并且我目前正在运行 GUI 的许多窗口(用于测试目的)。
  • patientscrollPane.setSize(968, 505); 在我启动 GUI 时也会被调用 - 这会是个问题吗?

标签: java swing jtable refresh defaulttablemodel


【解决方案1】:

尝试调用

 tablemodel.fireTableDataChanged();

更新表模型后 不知道这是否是您正在寻找的答案。我已经很久没有使用swing了。

【讨论】:

  • 你不应该从模型外部调用 fireXxx 方法。如果您使用适当的添加/删除/更新方法,那么这将自动完成
  • @MadProgrammer 谢谢我会调查它:)
【解决方案2】:

好的,我非常高兴地发布了这篇文章。整个问题在于我将 TableModel 定义为 DefaultTableModel,而不是 AbstractTableModel,覆盖并创建新的 removeRowaddRowinsertList 方法。

public void setList(ArrayList<Patient> patientlist) {
        this.patientlist = patientlist;
        fireTableDataChanged();
    }

public void removeRow(int row)
{
    patientlist.remove(row);
    fireTableRowsDeleted(row, row);
} 

public void addRow(Patient patient) {
    patientlist.add(patient);
    int row = patientlist.indexOf(patient);
    for(int column = 0; column < patientlist.size(); column++) {
        fireTableCellUpdated(row, column);
    }
    fireTableRowsInserted(row, row);
}

我建议任何从数组列表等创建任何自定义类型的表模型的人始终使用AbstractTableModel

【讨论】:

    猜你喜欢
    • 2012-09-21
    • 1970-01-01
    • 2015-06-03
    • 2017-04-24
    • 2012-05-11
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多