JTable .getColumnName не обновляется после.setHeaderValue

Я довольно новичок в 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 ответа

Я нашел решение. Это может быть не красиво, но в основном я использовал ArrayList для создания виртуальной таблицы в программе. Когда я меняю один из столбцов, я заменяю значение массива новым. При получении нового значения я бы пошел найти его в массиве.

Я уверен, что есть лучший способ, но это решило мою проблему.

Большое спасибо всем вам за вашу помощь.

После изменения 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());
 }
}
Другие вопросы по тегам