永发信息网

新手问题,有关JAVA中JTable更新的问题

答案:1  悬赏:80  手机版
解决时间 2021-03-30 16:10
  • 提问者网友:风月客
  • 2021-03-30 03:46
新手问题,有关JAVA中JTable更新的问题
最佳答案
  • 五星知识达人网友:詩光轨車
  • 2021-03-30 05:17
这里牵扯到一个基本的原则:
当一个 JComponent object 被添加到JContainer之后 (比如frame.add(panel), 你不能对这个object 本身做任何修改.比如用new(), addActionListener() 等等. 如果尝试做任何修改,并不会报错,也不会影响运行,但是这些修改会完全没有效果,如果这时你用println去看这个object的信息时,你会发现这些信息变成了默认的,而且这个object会被标记为Invalid.

也就是说,如果你是在需要更改数据的时候,采取table=new JTable(func1(),func2());这个途径,那就会产生数据没有被更新的问题. 因为这时你已经没有办法对这个object本身做任何修改了.

解决的方法就是建立一个二维数组(例如a)以及一个字符串数组(例如b)来接收functions返回的值, 然后在初始化table的时候用 JTable table = new JTable(a,b); 之后对a和b的内容修改, 再调用table.repaint()就可以了.

此外还需要注意一点,同样的,你只能改变a和b的内容,也就是所储存的值,而不能重新定义a和b, 不能用new或者指向另外一个同类型的变量而改变它们的内存地址,因为JTable初始化时是指向a与b所在的内存位置,而不是这个变量本身,而table在被添加之后,这个指向的内存地址是无法被改变的.所以如果你重新定义了a,b, 改变了它们的内存地址,那么也就失去了他们和table之间的联系.

根据以上的解释你应该可以很轻松的解决你的问题了, 如果还是无法解决,请阅读/参考下面的代码:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;

@SuppressWarnings("serial")
public class ChangeJTableValueDemo extends JFrame implements ActionListener {
private static final int NUMBER_OF_ROWS = 20;
private static final String RANDOMISE_BUTTON_DISPLAY = "Radomise value";
private Integer[][] data;
private JTable table;
JButton randomiseButton;

public ChangeJTableValueDemo() {
JPanel panel = new JPanel();
randomiseData(NUMBER_OF_ROWS);
String[] columns = getSampleColumnNames();
table = new JTable(data, columns);
randomiseButton = new JButton(RANDOMISE_BUTTON_DISPLAY);
randomiseButton.addActionListener(this);
panel.add(table);
panel.add(randomiseButton);
add(panel);
}
@Override
public void actionPerformed(ActionEvent event) {
if (event.getActionCommand().equals(RANDOMISE_BUTTON_DISPLAY)) {
randomiseData(NUMBER_OF_ROWS);
table.repaint();
}
}
private void randomiseData(int length) {
if (data == null)
data = new Integer[length][2];
for (int i = 0; i < length; i++) {
data[i][0] = i;
data[i][1] = new Random().nextInt(100);
}
}
private String[] getSampleColumnNames() {
String[] result = {"ID", "Value"};
return result;
}
private static void createAndShowGUI() {
JFrame frame = new ChangeJTableValueDemo();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
createAndShowGUI();
}
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯