JTable .getColumnName在.setHeaderValue之后不更新

时间:2014-06-26 14:13:00

标签: java swing netbeans jtable jtableheader

我对Java很新,并且有一个基本问题。我一直试图在互联网上找到答案,但我仍然不明白一旦我更改了它们,我将如何检索新的列名。

我正在使用Netbeans并拥有以下代码:

int columnNum = 2

jTable1.getTableHeader().getColumnModel().getColum(columnNum).setHeaderValue("Test");
repaint();

System.out.println(jTable1.getColumnName(columnNum));

我的结果不会打印为测试,但我将获得以前存在的旧值。我知道我应该使用一些名为fireTableStrucutreChanged()的东西,但我不确定如何在Netbeans中这样做。如果是这个想法,请你解释一下该怎么做。

非常感谢并抱歉这可能会给大家带来麻烦。

修改

这是一个例子。表单正在更新,因此很好,但内部值(当获取列的名称不更新时):

表格 - 图像

http://s13.postimg.org/t8xiadfl3/test.jpg

代码

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    String remove = "Title 1";
    for(int x = 0; x < jTable1.getColumnCount(); x++) {
        if(jTable1.getColumnName(x).equals(remove)) {
            jTable1.getTableHeader().getColumnModel().getColumn(x).setHeaderValue("Test");
            repaint();
            System.out.println(jTable1.getColumnName(x));
        }
    }
}        

编辑 - 为表单添加了创建代码。

private void initComponents() {

    jPanel1 = new javax.swing.JPanel();
    jButton1 = new javax.swing.JButton();
    jScrollPane1 = new javax.swing.JScrollPane();
    jTable1 = new javax.swing.JTable();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jButton1.setText("jButton1");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });

    jTable1.setModel(new javax.swing.table.DefaultTableModel(
        new Object [][] {
            {null, null, null, null},
            {null, null, null, null},
            {null, null, null, null},
            {null, null, null, null}
        },
        new String [] {
            "Title 1", "Title 2", "Title 3", "Title 4"
        }
    ));
    jScrollPane1.setViewportView(jTable1);

    javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
    jPanel1.setLayout(jPanel1Layout);
    jPanel1Layout.setHorizontalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel1Layout.createSequentialGroup()
            .addGap(153, 153, 153)
            .addComponent(jButton1)
            .addContainerGap(174, Short.MAX_VALUE))
        .addGroup(jPanel1Layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
            .addContainerGap())
    );
    jPanel1Layout.setVerticalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel1Layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jButton1)
            .addGap(18, 18, 18)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 139, Short.MAX_VALUE)
            .addContainerGap())
    );

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
    );

    pack();
}

2 个答案:

答案 0 :(得分:0)

更改headerValue后,您需要重新绘制JTableHeader

table.getColumnModel().getColumn(0).setHeaderValue("Test");
table.getTableHeader().repaint();

编辑:改变actionPerformed(),如下:

String remove = "Title 1";
for(int x = 0; x < t.getColumnCount(); x++) {
  if(jTable1.getColumnName(x).equals(remove)) {
  jTable1.getTableHeader().getColumnModel().getColumn(x).setHeaderValue("Test");
  jTable1t.getTableHeader().repaint();
  System.out.println(jTable1.getColumnModel().getColumn(x).getHeaderValue());
 }
}

答案 1 :(得分:0)

我找到了解决方案。它可能不是很漂亮,但基本上我使用ArrayList在程序中创建一个虚拟表。当我改变其中一列时,我会用新值替换Array的值。在获取新值时,我会在Array中找到它。

我确信有更好的方法,但它解决了我的问题。

非常感谢大家的帮助。