Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新jtable-java时出现的问题_Java_Swing_Jtable - Fatal编程技术网

更新jtable-java时出现的问题

更新jtable-java时出现的问题,java,swing,jtable,Java,Swing,Jtable,我创建了一个类,在其中我创建了jtable。我有一些问题,因为当我尝试更新它时,它不起作用(什么都没有发生-我认为我尝试更新它的方式是错误的?)。我做错了什么 class tableClass { public Vector rowData = null; public Vector columnNames = null; private JTable jTable; DefaultTableModel model; public tableCla

我创建了一个类,在其中我创建了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();
    }
}

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();
    }
}
您可以按如下方式更改代码,以证明更改是有效的注意我并不提倡这种方法-您应该真正实现自己的表格模型,但只需向您展示如何更改基础模型本身,从而在屏幕上的JTable中看到所发生的更改

编辑因为此答案已被接受,在@kleopatra的评论之后,我使用@Adam的答案(+1)更新了下面的代码,以显示如何更新
updateTable
中的整个数据向量。我仍然不会在生产代码中这样做,但至少这在功能上是正确的,更接近OPs问题

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的
rowData

为您指明正确的方向,这里有一个稍微干净的类工作版本。如果您有大量数据,请注意这样更新表是没有效率的!您最好自己将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);
    }
公共类表{
公共向量列名称;
专用JTable表;
公共表(JPanel面板、矢量行数据、,
向量列名称){
this.columnNames=columnNames;
表=新的JTable(行数据、列名称);
表.setFillsViewPerthweight(真);
JScrollPane scrollPane=新的JScrollPane(表);
scrollPane.setPreferredSize(新维度(300100));
panel.add(滚动窗格,BorderLayout.CENTER);
}
公共void updateTable(矢量行数据){
DefaultTableModel=(DefaultTableModel)table.getModel();
model.setDataVector(行数据、列名称);
}

您在
updateTable
中没有更改任何内容,如果您什么都不更改,您希望会发生什么?“rowData”包含新的内容数据,我相信该模型。fireTableDataChanged();应该刷新它吗?您将
rowData
指向
rowDataInput
JTable
不知道这一点,它仍然指向旧的
rowData
。我相信您对这里的指针感到困惑。底线是,告诉您的表模型数据已更改,然后调用
fireTableDataChanged
顺便说一句,只通知附加视图,例如
JTable
@stryba-不,不要调用fireTableDataChanged,从模型外的代码更改,这完全是模型实现的工作。@kleopatra你是对的,我忘了我们在模型外,我的错。谢谢你指出。在更新中,我还有'model=(DefaultTableModel)'jTable.getModel();model.fireTableDataChanged()“或者我遗漏了什么?是的-在构造函数中传递给JTable的rowData永远不会更改…您只是更新对rowData的引用,而不是rowData本身或JTable知道的任何内容。您有没有可能给我举个例子?非常感谢,在更新部分不幸的是,您的代码没有执行OP(可能)想要实现的任何操作:这类似于批量替换支持DefaultTableModel的dataVector。听起来您还没有更改模型。请更新(添加新代码)你的问题,我会再看一眼:)。不需要从外面发射任何东西,DefaultTableModel表现良好:-)@kleopatra很好。现在编辑完毕,几乎什么都没有了!@Adam我更新了我的答案,加入了你的(更好、更完整)演示如何一次性替换所有基础数据的示例。我也对您的答案投了赞成票。