1

为什么表格单元格 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 需要更新或整个表需要重绘。

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

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 中创建了一个静态方法,每次在数组中添加/更新/删除对象时都会调用该方法。此方法将在更新后重做整个模型,因此会刷新表。

4

2 回答 2

3

您的问题(和前一个问题)的解决方案相当简单,但不幸的是有点太长了,无法在评论中发布

  1. 您确保您阅读了一些关于 aJTable实际工作原理的内容。一个很好的起点是Swing 教程,甚至可能是最重要的类的 javadocJTableTableModel. 另一个关于 Swing 和 MVC 使用的好书是这个文档。它比仅JTables 更广泛,但会让您更深入地了解所有 Swing 组件是如何设计的,以及您应该如何使用它们。
  2. 阅读该教程后,您应该了解,如果要更新表中显示的数据,则需要更新表的模型。模型将触发表格接收到的事件,表格将确保它自己更新。毕竟,表格只是数据的一个视图(=the TableModel),所以更新应该在模型端进行。如果不清楚,请返回步骤 1
  3. 现在看一下您的代码并删除侦听器。相反,更新表上的模型并查看表如何自我更新。
  4. 如果这不起作用,您会带着您发布的SSCCE返回此站点。这样我们就可以看到你尝试了一些东西,你尝试了什么,很可能你的代码有什么问题。此 SSCCE 应包括您TableModel使用的代码和更新您的代码,TableModel因为这是您的问题最有可能出现的位置。
于 2012-03-20T21:33:01.870 回答
3

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

于 2012-03-21T07:35:25.487 回答