更新jtable java的问题

时间:2012-03-08 12:07:50

标签: java swing jtable

我创建了一个我创建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();
    }
}

3 个答案:

答案 0 :(得分:2)

为了指出正确的方向,这是一个稍微清洁的班级工作版本。如果您有大量数据,请注意更新此类表格效率不高!你最好自己继承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);
    }

答案 1 :(得分:1)

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

换句话说,当你更新rowData中的updateTable时,你没有更新你在构造函数中传递给JTable的rowData对象。

以下课程在功能上与您的课程相同。这是否更清楚为什么你所做的事没有效果?你看,tableData和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)后,我将更新以下代码以显示如何更新整个数据Vector或Vectors在updateTable。我仍然不会在生产代码中这样做,但至少这在功能上是正确的,更接近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);
    }
}

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

答案 2 :(得分:0)

当你写:

rowData = rowDataInput;

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