gpt4 book ai didi

java - JTable 不会刷新

转载 作者:行者123 更新时间:2023-11-29 07:15:39 26 4
gpt4 key购买 nike

为什么表格单元格 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com