Вы никогда не изменяете данные таблицыModel вообще, поэтому имеет смысл, что JTable никогда не изменяется. Возможно, вы хотите вызвать setValueAt(...)
на модели, чтобы изменить значение, удерживаемое одной из его ячеек. После этого вам не нужно звонить fireXxxx(...)
на модель, так как это (и должно быть) вызвано внутренним самой моделью.
А, я понимаю, что вы сделали. Вы думаете, что, изменив String, на который ссылается var
, данные JTable будут волшебным образом изменяться, но это магическое мышление, поскольку все, что вы делаете, это изменение объекта, к которому относится переменная var
, и вы абсолютно не влияете на Объект String, о котором он говорил ранее, и который отображается в JTable. Эта проблема попадает в основную концепцию модели ООП в Java, а именно разницу между объектами и ссылочными переменными. Изменение ссылки на переменную не влияет на объект, на который он ссылается. Опять же, позвоните по номеру setValueAt(...)
, и ваша проблема решена.
Например:
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class Test extends JPanel {
static String var = "One";
Object rowData[][] = { { var, "Two", "Three" }, { "Four", "Five", "Six" } };
Object columnNames[] = { "Column One", "Column Two", "Column Three" };
JTable table;
DefaultTableModel tableModel;
JButton button = new JButton("Refresh");
public Test() {
tableModel = new DefaultTableModel(rowData, columnNames);
table = new JTable(tableModel);
add(table);
button.addActionListener(new Action());
add(button);
}
private class Action implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String var2 = "ONE";
System.out.println(var2);
// String[] data = { "ciao" };
// tableModel.fireTableStructureChanged();
tableModel.setValueAt(var2, 0, 0);
}
}
private static void createAndShowGui() {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new Test());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
Вы правы, что это самый простой способ, спасибо! – Romeo