不解: 用数组初始化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();
}
}}

解决方案 »

  1.   

    还有更夸张的,,,直接设置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();
    }
    }}
      

  2.   

    有人研究过这个吗?
    我就是想问一下....怎么能解除这个连带关系...也就是..我想,在jTable.setValueAt后...不改变this.tmp..应该这么做?用其他方式初始化jTable吗?
      

  3.   

    呵呵!这个问题很有趣的,JTable与数组就是关联在一起的。
    好像没有办法分开,不过,我觉得有必要分开吗?你另外定义一个数组用不就可以了,为啥一定还要使用原来的数组?
      

  4.   

    本来,关联在一起,你就可以通过修改数组来修改table里的数据,如果取消关联了,那你如何修改table里的数据呢?难不成重新生成一个新的JTable?
      

  5.   

    一楼里,没见你定义新的数组啊?
    this.tmp = tablec;这句表明tmp与tablec是一个对象,都关联到JTable的内容。显示的内容与这两个对象双向联动。
      

  6.   

    楼上说的很对。显然,楼主这里误解了。你的数组名字tmp是与JTable关联的,无论你给它什么实体,它都是与JTable联系在一起的。我的意思是,所谓“一个新的数组”,就是一个新的名字,与tmp无关的——或者更明白地说,tmp这个名字你不能再用了,它已经注定关联到JTable了。