Java - 方法更改 JTable 中变量的值(刷新不起作用)
Java - Method changes value of variable in JTable (refresh not working)
我有一个 JTable,其中一个单元格内有一个变量。单击 Button 时,变量发生变化,但 JTable 中没有任何变化。
这是我的简单示例代码:
public class Test extends JPanel {
static String var = "One";
Object rowData[][] = { { var, "Two", "Three" },
{ "Four", "Five", "Six" } };
Object columnNames[] = { "Column One", "Column Two", "Column Three" };
static JTable table;
static DefaultTableModel tableModel;
JButton button = new JButton("Refresh");
public Test(){
tableModel = new DefaultTableModel(rowData, columnNames);
table = new JTable(tableModel);
add(table);
button.addActionListener(new Action());
add(button);
}
private static class Action implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
var = "ONE";
System.out.println(var);
String[] data = {"ciao"};
tableModel.fireTableStructureChanged();
}
}
}
有人可以帮我吗?
谢谢!
您根本不会更改 tableModel 的数据,因此 JTable 永远不会更改是有道理的。也许您想对模型调用 setValueAt(...)
以更改其中一个单元格所持有的值。执行此操作后,无需在模型上调用 fireXxxx(...)
,因为模型本身(并且应该)在内部 调用它。
啊,我明白你做了什么。您认为通过更改 var
引用的字符串,JTable 的数据将神奇地改变,但这是神奇的想法,因为您所做的只是更改 var
变量引用的对象,而您' 对它之前引用并显示在 JTable 中的 String 对象完全没有影响。这个问题触及了 Java 的 OOP 模型的核心概念,即对象和引用变量之间的区别。更改变量引用对其引用的对象没有影响。再次对您的模型调用 setValueAt(...)
,您的问题就解决了。
例如:
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class Test extends JPanel {
static String var = "One";
Object rowData[][] = { { var, "Two", "Three" }, { "Four", "Five", "Six" } };
Object columnNames[] = { "Column One", "Column Two", "Column Three" };
JTable table;
DefaultTableModel tableModel;
JButton button = new JButton("Refresh");
public Test() {
tableModel = new DefaultTableModel(rowData, columnNames);
table = new JTable(tableModel);
add(table);
button.addActionListener(new Action());
add(button);
}
private class Action implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String var2 = "ONE";
System.out.println(var2);
// String[] data = { "ciao" };
// tableModel.fireTableStructureChanged();
tableModel.setValueAt(var2, 0, 0);
}
}
private static void createAndShowGui() {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new Test());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
我有一个 JTable,其中一个单元格内有一个变量。单击 Button 时,变量发生变化,但 JTable 中没有任何变化。 这是我的简单示例代码:
public class Test extends JPanel {
static String var = "One";
Object rowData[][] = { { var, "Two", "Three" },
{ "Four", "Five", "Six" } };
Object columnNames[] = { "Column One", "Column Two", "Column Three" };
static JTable table;
static DefaultTableModel tableModel;
JButton button = new JButton("Refresh");
public Test(){
tableModel = new DefaultTableModel(rowData, columnNames);
table = new JTable(tableModel);
add(table);
button.addActionListener(new Action());
add(button);
}
private static class Action implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
var = "ONE";
System.out.println(var);
String[] data = {"ciao"};
tableModel.fireTableStructureChanged();
}
}
}
有人可以帮我吗? 谢谢!
您根本不会更改 tableModel 的数据,因此 JTable 永远不会更改是有道理的。也许您想对模型调用 setValueAt(...)
以更改其中一个单元格所持有的值。执行此操作后,无需在模型上调用 fireXxxx(...)
,因为模型本身(并且应该)在内部 调用它。
啊,我明白你做了什么。您认为通过更改 var
引用的字符串,JTable 的数据将神奇地改变,但这是神奇的想法,因为您所做的只是更改 var
变量引用的对象,而您' 对它之前引用并显示在 JTable 中的 String 对象完全没有影响。这个问题触及了 Java 的 OOP 模型的核心概念,即对象和引用变量之间的区别。更改变量引用对其引用的对象没有影响。再次对您的模型调用 setValueAt(...)
,您的问题就解决了。
例如:
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class Test extends JPanel {
static String var = "One";
Object rowData[][] = { { var, "Two", "Three" }, { "Four", "Five", "Six" } };
Object columnNames[] = { "Column One", "Column Two", "Column Three" };
JTable table;
DefaultTableModel tableModel;
JButton button = new JButton("Refresh");
public Test() {
tableModel = new DefaultTableModel(rowData, columnNames);
table = new JTable(tableModel);
add(table);
button.addActionListener(new Action());
add(button);
}
private class Action implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String var2 = "ONE";
System.out.println(var2);
// String[] data = { "ciao" };
// tableModel.fireTableStructureChanged();
tableModel.setValueAt(var2, 0, 0);
}
}
private static void createAndShowGui() {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new Test());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}