更新jtable java时出现问题



我创建了一个类,用于创建jtable。我有一些问题,因为当我尝试更新它时,它不起作用(什么都没发生——我认为我尝试更新的方式是错误的?)。我做错了什么?

class tableClass
{
    public Vector rowData = null; 
    public Vector columnNames = null; 
    private JTable jTable; 
    DefaultTableModel model;
    public tableClass(JPanel jPanel, Vector rowDataInput, Vector columnNamesInput)
    {       
        rowData = rowDataInput; 
        columnNames = columnNamesInput;
        jTable = new JTable(rowData, columnNames);
        jTable.setFillsViewportHeight(true);
        JScrollPane jScrollPane = new JScrollPane(jTable);
        jScrollPane.setPreferredSize(new Dimension(300, 100));
        jPanel.add(jScrollPane,BorderLayout.CENTER);
    }
    public void updateTable(Vector rowDataInput)
    {
        rowData = rowDataInput;  
        model =(DefaultTableModel)jTable.getModel();  
        model.fireTableDataChanged();
    }
}

为了给您指明正确的方向,这里有一个稍微干净一点的类工作版本。如果你有很多数据,请注意这样更新表是无效的!您最好自己将AbstractTableModel子类化,并映射到您已经拥有的任何数据结构。

public class Table {
    public Vector<String> columnNames;
    private JTable table;
    public Table(JPanel panel, Vector<Vector<Object>> rowData,
            Vector<String> columnNames) {
        this.columnNames = columnNames;
        table = new JTable(rowData, columnNames);
        table.setFillsViewportHeight(true);
        JScrollPane scrollPane = new JScrollPane(table);
        scrollPane.setPreferredSize(new Dimension(300, 100));
        panel.add(scrollPane, BorderLayout.CENTER);
    }
    public void updateTable(Vector<Vector<Object>> rowData) {
        DefaultTableModel model = (DefaultTableModel) table.getModel();
        model.setDataVector(rowData, columnNames);
    }

rowData被赋予构造函数中的JTable。然后在updateTable中,只需更新TableClass中的rowData字段。因此,JTable及其TableModel都不知道您的更改。您需要在updateTable中更新表的模型。

换句话说,当您在updateTable中更新rowData时,您并没有更新传递到构造函数中JTable的同一个rowData对象。

下面的类在功能上与您的类相同。这会让你更清楚为什么你所做的没有效果吗?您可以看到,TableClass和JTable并没有共享rowData。它不应该——你应该更新TableModel。您可以实现自己的TableModel,并使用更改更新该对象。

class tableClass
{
    public Vector columnNames = null; 
    private JTable jTable; 
    DefaultTableModel model;
    public tableClass(JPanel jPanel, Vector rowDataInput, Vector columnNamesInput)
    {       
        Vector rowData = rowDataInput; 
        columnNames = columnNamesInput;
        jTable = new JTable(rowData, columnNames);
        jTable.setFillsViewportHeight(true);
        JScrollPane jScrollPane = new JScrollPane(jTable);
        jScrollPane.setPreferredSize(new Dimension(300, 100));
        jPanel.add(jScrollPane,BorderLayout.CENTER);
    }
    public void updateTable(Vector rowDataInput)
    {
        Vector rowData = rowDataInput;  
        model =(DefaultTableModel)jTable.getModel();  
        model.fireTableDataChanged();
    }
}

您可以按照如下方式更改代码,以证明这些更改是有效的请注意我并不提倡这种方法-您应该真正实现自己的TableModel,只是简单地向您展示如何更改底层模型本身,从而在屏幕上的JTable中看到更改。

编辑由于此答案已被接受,根据@kleopatra的评论并使用@Adam的答案(+1),我更新了以下代码,以显示如何更新updateTable中的整个数据Vector或Vectors。我仍然不会在生产代码中这样做,但至少这在功能上是正确的,更接近于OP的问题。

class MyTable {
    private Vector columnNames = null; 
    private JTable jTable;
    public tableClass(JPanel jPanel, Vector rowDataInput, Vector columnNamesInput) {
        // ...
        jTable = new JTable(rowData, columnNames);
        // ...
    }
    public void updateTable(Vector rowDataInput) {
        model =(DefaultTableModel)jTable.getModel();
        // Now actually update the model with your new data:
        model.setDataVector(rowDataInput, columnNames);
    }
}

正如我所说,这不是一个好方法,但我只是想向你展示为什么你所做的不起作用。:)

编写时:

rowData = rowDataInput;

它不会更改您在构造函数中传递给jTable的CCD_ 12。

最新更新