不解: 用数组初始化jTable时,为什么在jTable输出之后,数组的改变还能起作用....

Kreocn 2007-12-28 11:27:29
不解: 用数组初始化jTable时,为什么在jTable输出之后,数组的改变还能起作用....

运行这段程序就明白我在讲什么了....


package my.test;
import javax.swing.JScrollPane;
import javax.swing.JTable;

import javax.swing.WindowConstants;

public class Swing_Test_1 extends javax.swing.JFrame {
/**
*
*/
private static final long serialVersionUID = 6785582286857692443L;
private JScrollPane jScrollPane_testjTable;
private JTable jTable1;

/**
* Auto-generated main method to display this JFrame
*/
public static void main(String[] args) {
Swing_Test_1 inst = new Swing_Test_1();
inst.setVisible(true);
}

public Swing_Test_1() {
super();
initGUI();
}

private void initGUI() {
try {
String[][] tablec = new String[][] { { "One", "Two" }, { "Three", "Four" } };
String[] tableh = new String[] { "Column 1", "Column 2" };
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
getContentPane().setLayout(null);
{
jScrollPane_testjTable = new JScrollPane();
getContentPane().add(jScrollPane_testjTable);
jScrollPane_testjTable.setBounds(0, 42, 392, 231);
{
jTable1 = new JTable(
tablec,
tableh
);
jScrollPane_testjTable.setViewportView(jTable1);
}
}
pack();
setSize(400, 300);

//看这句......不解.....
tablec[0][1] = "xxxxx";
} catch (Exception e) {
e.printStackTrace();
}
}

}

...全文
96 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lixkyx 2008-01-02
  • 打赏
  • 举报
回复
楼上说的很对。显然,楼主这里误解了。你的数组名字tmp是与JTable关联的,无论你给它什么实体,它都是与JTable联系在一起的。我的意思是,所谓“一个新的数组”,就是一个新的名字,与tmp无关的——或者更明白地说,tmp这个名字你不能再用了,它已经注定关联到JTable了。
silswal 2008-01-02
  • 打赏
  • 举报
回复
一楼里,没见你定义新的数组啊?
this.tmp = tablec;这句表明tmp与tablec是一个对象,都关联到JTable的内容。显示的内容与这两个对象双向联动。
Kreocn 2008-01-02
  • 打赏
  • 举报
回复
看看我在一楼的新的测试啊.......这个已经是定义一个新的数组了.....但是...连新的数组里面的数值都变了.....
Kreocn 2007-12-28
  • 打赏
  • 举报
回复
有人研究过这个吗?
我就是想问一下....怎么能解除这个连带关系...也就是..我想,在jTable.setValueAt后...不改变this.tmp..

应该这么做?用其他方式初始化jTable吗?
Kreocn 2007-12-28
  • 打赏
  • 举报
回复
还有更夸张的,,,直接设置jTable的Value,居然还能连带反应...把最上层的数组也能改掉,,,,看这个就知道了....


package my.test;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

import javax.swing.WindowConstants;

public class Swing_Test_1 extends javax.swing.JFrame {
/**
*
*/
private static final long serialVersionUID = 6785582286857692443L;
private JScrollPane jScrollPane_testjTable;
private JTable jTable1;
private String tmp[][] = null;
private JLabel jLabel1;

/**
* Auto-generated main method to display this JFrame
*/
public static void main(String[] args) {
Swing_Test_1 inst = new Swing_Test_1();
inst.setVisible(true);
}

public Swing_Test_1() {
super();
initGUI();
}

private void initGUI() {
try {
String[][] tablec = new String[][] { { "One", "Two" }, { "Three", "Four" } };
String[] tableh = new String[] { "Column 1", "Column 2" };

this.tmp = tablec;

this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
getContentPane().setLayout(null);
{
jScrollPane_testjTable = new JScrollPane();
getContentPane().add(jScrollPane_testjTable);
jScrollPane_testjTable.setBounds(0, 42, 392, 231);
{
jTable1 = new JTable(
tablec,
tableh
);
jScrollPane_testjTable.setViewportView(jTable1);
}
}
{
jLabel1 = new JLabel();
getContentPane().add(jLabel1);
jLabel1.setText("jLabel1");
jLabel1.setBounds(28, 7, 133, 28);
}
pack();
setSize(400, 300);

//看这句......不解.....
tablec[0][1] = "xxxxx";
jTable1.setValueAt("yyyyy", 1, 0);
jLabel1.setText(this.tmp[1][0]);
} catch (Exception e) {
e.printStackTrace();
}
}

}
lixkyx 2007-12-28
  • 打赏
  • 举报
回复
本来,关联在一起,你就可以通过修改数组来修改table里的数据,如果取消关联了,那你如何修改table里的数据呢?难不成重新生成一个新的JTable?
lixkyx 2007-12-28
  • 打赏
  • 举报
回复
呵呵!这个问题很有趣的,JTable与数组就是关联在一起的。
好像没有办法分开,不过,我觉得有必要分开吗?你另外定义一个数组用不就可以了,为啥一定还要使用原来的数组?

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧