JTable不会刷新

时间:2012-03-20 18:52:52

标签: 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 = 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"});
    }
}

编辑(更好的解决方案,它对我的​​工作方式完美无缺)使用静态方法。由于我是通过另一个Frame在数组中添加新数据,我在MainFrame中创建了一个静态方法,每次我在数组中添加/更新/删除Object时都会调用它。此方法将在更新后重做整个模型,因此将刷新表。

2 个答案:

答案 0 :(得分:3)

您的问题(以及之前的问题)的解决方案相当简单,但不幸的是,将其发布在评论中有点太长

  1. 您确保对JTable的实际工作方式进行了一些阅读。一个很好的起点是Swing tutorial,甚至可能是最重要的类JTableTableModel的类javadoc。关于Swing和MVC的使用的另一个好读物是this document。它比JTable更广泛,但会为您提供有关如何设计所有Swing组件以及如何使用它们的更多信息。
  2. 阅读完该教程后,您应该了解如果要更新表中显示的数据,则需要更新表的模型。该模型将触发表接收的事件,该表将确保它自己更新。毕竟,该表只是数据的视图(= TableModel),因此应该在模型端进行更新。如果不清楚,请返回步骤1
  3. 现在看看你的代码并删除监听器。相反,更新表上的模型并查看表如何更新自身。
  4. 如果这不起作用,您将使用您发布的SSCCE返回此网站。这样我们就可以看到你尝试了一些东西,你尝试了什么,最有可能的是你的代码中出了什么问题。此SSCCE应包含您使用的TableModel代码以及更新TableModel的代码,因为这是您问题的最有可能的位置。

答案 1 :(得分:3)

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