java - JTable 不会刷新

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

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

最佳答案

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

关于java - JTable 不会刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9793103/

相关文章:

java - 有没有办法自动化 junit bean 属性测试?

java - 从 <p> 元素中提取标记实体

java Collections.binarySearch() 返回 -2

java - 计算 JTable 中的列和行中的值的总和

java - JTable - 用于选择行的 ActionListener

java - 帮助 Java 日历——它给出了一些奇怪的输出

java - 如何生成 1 次鼠标 + 1 次键盘点击?

java - 如何在Swing中获取不包括 "System Tray"的桌面大小

Java 在 MainThread.join() 时更新 GUI?

java - 如何在应用 MaskFormatter 后使 JTable 单元格中的插入符显示在左侧