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());
}
}