Java JTable-won';t刷新

Java JTable-won';t刷新,java,swing,jtable,jframe,defaulttablemodel,Java,Swing,Jtable,Jframe,Defaulttablemodel,为什么表单元格0,1不会从aaa更改为XXXX import java.awt.*; import javax.swing.*; import javax.swing.table.DefaultTableModel; class MainFrame { public static void main(String[] args) { JFrame f = new JFrame("Refreshing JTable"); JPanel p = n

为什么表单元格0,1不会从aaa更改为XXXX

import java.awt.*;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;


class MainFrame {

    public static void main(String[] args) {


        JFrame f = new JFrame("Refreshing JTable");
        JPanel p = new JPanel(new GridBagLayout());
        DefaultTableModel productsModel;
        JTable productsTable;

        f.setSize(800, 600);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        String[] tableTitle = new String[] {"ID", "Name"};
        String[][] tableData = {{"1", "AAA"},{"2", "BBB"}};


        productsModel = new DefaultTableModel(tableData, tableTitle);
        productsTable = new JTable(productsModel) {
            public boolean isCellEditable(int r, int c) {
                return false;
            }
        };

        JScrollPane scrollpane = new JScrollPane(productsTable);


        tableData[0][1] = "XXXX";

        f.add(p);
        p.add(scrollpane);
        f.validate();
        f.setVisible(true);


    }


}
原因: 显然,试图更新存储数据的数组将导致JTable无法更改。要么需要更新DefaultTableModel,要么需要重新绘制整个表

编辑(可能的解决方案)一种方法是使用计时器

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;

class MainFrame {

    static JFrame f = new JFrame("Refreshing JTable");
    static JPanel p = new JPanel(new GridBagLayout());
    static DefaultTableModel productsModel;
    static JTable productsTable;

    public static void main(String[] args) {
        runGui();
    }

    @SuppressWarnings("serial")
    public static void runGui() {

        f.setSize(800, 600);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        String[] tableTitle = new String[] {"ID", "Name"};
        String[][] tableData = {{"1", "AAA"},{"2", "BBB"}};


        productsModel = new DefaultTableModel(tableData, tableTitle);
        productsTable = new JTable(productsModel) {
            public boolean isCellEditable(int r, int c) {
                return false;
            }
        };

        JScrollPane scrollpane = new JScrollPane(productsTable);


        tableData[0][1] = "XXXX";

        Timer t = new Timer(2000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                addColumns();
                remakeData();
                productsTable.setModel(productsModel);

            }
        });
        t.start();

        f.add(p);
        p.add(scrollpane);
        f.validate();
        f.setVisible(true);


    }

    private static void addColumns() {
        productsModel.setColumnCount(0);
        productsModel.addColumn("ID");
        productsModel.addColumn("Name");
    }

    private static void remakeData() {
        productsModel.setRowCount(0);
        productsModel.insertRow(productsModel.getRowCount(), new Object[] {"1", "Dummy item 1"});
        productsModel.insertRow(productsModel.getRowCount(), new Object[] {"2", "Dummy itme 2"});
        productsModel.insertRow(productsModel.getRowCount(), new Object[] {"3", "Dummy item 3"});
        productsModel.insertRow(productsModel.getRowCount(), new Object[] {"4", "Dummy item 4"});
        productsModel.insertRow(productsModel.getRowCount(), new Object[] {"5", "Dummy item 5"});
    }
}

使用静态方法编辑(更好的解决方案,它完美地为我工作)。由于我通过另一个帧在数组中添加新数据,所以我在大型机中创建了一个静态方法,每次在数组中添加/更新/删除对象时都会调用该方法。此方法将在更新后重做整个模型,因此将刷新表。

您的问题(以及上一个问题)的解决方案相当简单,但遗憾的是,有点太长,无法在注释中发布

  • 您必须阅读
    JTable
    的实际工作原理。一个好的起点是最重要的类和类的javadoc,甚至可能是javadoc。关于Swing和MVC使用的另一本好书是。它比仅
    JTable
    s要广泛得多,但它将为您提供关于所有Swing组件的设计以及如何使用它们的更多见解
  • 阅读该教程后,您应该了解,如果要更新表中显示的数据,则需要更新表的模型。模型将触发表接收到的事件,并且表将确保其自身更新。毕竟,表格只是数据的一个视图(
    TableModel
    ),所以对take的更新应该在模型端进行。如果不清楚,请返回步骤1
  • 现在看一下您的代码并删除侦听器。而是更新表上的模型,并查看表如何更新自身
  • 如果这不起作用,您将返回此站点,并在其中发布。这样我们可以看到您尝试了一些东西,您尝试了什么,很可能代码中有什么错误。此SSCCE应包括您使用的
    TableModel
    的代码以及更新
    TableModel
    的代码,因为这是您最可能出现问题的位置

  • 您的问题(以及上一个问题)的解决方案相当简单,但遗憾的是,它太长了,无法在评论中发布

  • 您必须阅读
    JTable
    的实际工作原理。一个好的起点是最重要的类和类的javadoc,甚至可能是javadoc。关于Swing和MVC使用的另一本好书是。它比仅
    JTable
    s要广泛得多,但它将为您提供关于所有Swing组件的设计以及如何使用它们的更多见解
  • 阅读该教程后,您应该了解,如果要更新表中显示的数据,则需要更新表的模型。模型将触发表接收到的事件,并且表将确保其自身更新。毕竟,表格只是数据的一个视图(
    TableModel
    ),所以对take的更新应该在模型端进行。如果不清楚,请返回步骤1
  • 现在看一下您的代码并删除侦听器。而是更新表上的模型,并查看表如何更新自身
  • 如果这不起作用,您将返回此站点,并在其中发布。这样我们可以看到您尝试了一些东西,您尝试了什么,很可能代码中有什么错误。此SSCCE应包括您使用的
    TableModel
    的代码以及更新
    TableModel
    的代码,因为这是您最可能出现问题的位置

  • 发布在相关线程上的SSCCE的一个问题是,代码更改了最初形成表模型的数组,而它应该更改表模型本身。

    发布在相关线程上的SSCCE的一个问题是,代码更改了最初形成表模型的数组,然而,它应该改变表格模型本身。

    为了更快地获得更好的帮助,请发布一篇文章。我支持Andrew的伟大建议,因为我认为我们无法根据当前的信息猜出错误。还可以考虑用一个充满活力的So.Out.PrtLn调用代码来帮助调试错误源,并确保您的假设都是正确的。可能的复制品有多少次,您打算发布完全相同的问题而没有任何理解进展的迹象,总是没有SCSCE?很简单,因为您使用的是DefaultTableModel,所以无需执行任何操作。如果模型发生更改,JTable将自动更改其视图的状态,因为模型知道要触发通知视图更新的通知方法。由于这种情况没有发生,这表明某个地方有一个bug,这就是我们无法帮助您的原因。为了更快地获得更好的帮助,请发布一条。我支持Andrew的伟大建议,因为我认为我们无法根据现有信息猜出哪里出了问题。还可以考虑用一个充满活力的So.Out.PrtLn调用代码来帮助调试错误源,并确保您的假设都是正确的。可能的复制品有多少次,您打算发布完全相同的问题而没有任何理解进展的迹象,总是没有SCSCE?很简单,因为您使用的是DefaultTableModel,所以无需执行任何操作。如果模型发生更改,JTable将自动更改其视图的状态,因为模型知道要触发通知视图更新的通知方法。由于没有发生这种情况,这表明某个地方有一个bug,这就是为什么我们还不能帮助您。问题是,该表显示了我存储在数组中的sql查询的数据。另外,当我添加产品时,我将其添加到DB中,而不仅仅是tablemodel。然后我如何检索数据