【问题标题】:Refresh JTable firetableDataChanged is not executed刷新 JTable firetableDataChanged 未执行
【发布时间】:2015-04-06 16:46:10
【问题描述】:

在我从数据结构中的 excel 导入电子表格的名称后,我尝试使用 fireTableChanged() 方法更新我的 JTable,但该方法未执行。我通过测试确认数据已正确导入,并且 jtable 应该具有必要的信息。

我需要做什么才能正确更新 JTable? 我找到了该主题的其他几个链接,但没有一个对我有用:

Refresh Jtable

How to make JTable show refreshed data after updating database?

JTable How to refresh table model after insert delete or update the data.

AbstractDataTable fireTableDataChanged() does not refresh jtable

Can't refresh my JTable with new data

型号:

public class Model extends Observable {
String[][] data;
List<Arbeitsmappe> AMList = new LinkedList<>();
.....
public void setAMList(List<Arbeitsmappe> aMList) {
AMList = aMList; //new List replace the old
this.getData(); //The 2dimensional Array is filled with the names from the list
setChanged(); 
notifyObservers(Controller.Command_Excel_Eingelesen);
 }
}

查看:

    JTextField cellEditorTF = new JTextField();
    cellEditorTF.setEditable(false);
    DefaultCellEditor cellEditor = new DefaultCellEditor(cellEditorTF);

    ContentTable = new JTable(model.getData(), Model.columnNames);
    //Cell Editable FALSE
    ContentTable.getColumnModel().getColumn(0).setCellEditor(cellEditor);
    //Single Interval Selection 
    ContentTable.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
    //Cell Listener - When Cell is edited the new informationen is safed in AMLISt
    Action action = new AbstractAction()
    {
        public void actionPerformed(ActionEvent e)
        {
            TableCellListener tcl = (TableCellListener)e.getSource();
            Model.AMList.get(tcl.getRow()).Speichername = String.valueOf(tcl.getNewValue());
           // System.out.println("Row: " + tcl.getRow() + "  " + Model.data[tcl.getRow()][1]);
        }
    };
    TableCellListener tcl = new TableCellListener(ContentTable, action);
    JScrollPane scrollPane = new JScrollPane(ContentTable);
    ContentTable.setFillsViewportHeight(true);
    ContentTable.getTableHeader().setReorderingAllowed(false);

    this.add(BorderLayout.NORTH,ButtonPanel);
    this.add(BorderLayout.SOUTH,scrollPane);

}

@Override
public void update(Observable arg0, Object arg1) {
    if(arg0 instanceof Model){
        Model model = (Model) arg0;
        String cmd = (String) arg1;
        if(cmd.equals(Controller.Command_Excel_Eingelesen)){

            ((AbstractTableModel)ContentTable.getModel()).fireTableDataChanged();
            ContentTable.repaint();
            this.repaint();
        }
    }

【问题讨论】:

  • 如果您没有尽快获得帮助,请考虑创建并发布Minimal, Complete, and Verifiable Example Program,您可以在其中将代码压缩为仍可编译和运行的最小位,没有外部依赖项(例如需要链接到数据库或图像),没有与您的问题无关的额外代码,但仍能演示您的问题。
  • 还要注意,您不应该在您的表模型上调用任何fireXxxx() 方法。这些只能在您的表模型本身内部调用。你的设计似乎被你这样做破坏了。

标签: java swing jtable abstracttablemodel


【解决方案1】:
  1. ((AbstractTableModel)ContentTable.getModel()).fireTableDataChanged(); 在模型定义中被调用,它不应该,必须是代码的一部分,覆盖 AbstractTableModel 及其方法的类 void

  2. 除了此方法重置模型的所有自定义属性,以及 JTable 方法的重要部分(例如覆盖 XxxTableCellRenderer/Editor

  3. read API in part methods for fireTableXxxXxxJTable/AbstractTableModel 的所有生命周期都有通知器,请确保为每个操作/事件使用正确的通知器

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 2017-11-08
    • 2010-10-04
    • 2015-09-06
    相关资源
    最近更新 更多