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

我的JTable是用二维数组的构造方法创建的JTabletable=newJTable(func1(),func2());我用func1()函数来返回一个二维数组,用fu... 我的JTable是用二维数组的构造方法创建的JTable table=new JTable(func1(),func2());
我用func1()函数来返回一个二维数组,用func2()函数来返回一个String数组,然后我想根据我func1()函数里面的变量变化来更新JTable,我试过updataUI(),repaint()之类的,都不会更新,请教最简单的实现更新方法,最好能给个例程,会不会是我更新的表格的横纵格子数量导致不能更新?分数不是问题,好的加分,谢谢
展开
 我来答
hartx
推荐于2016-08-10 · TA获得超过332个赞
知道答主
回答量:199
采纳率:0%
帮助的人:159万
展开全部
这里牵扯到一个基本的原则:
当一个 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();
}
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式