Java - 方法更改 JTable 中变量的值(刷新不起作用)



我有一个JTable,其中一个单元格内有一个变量。单击按钮时,变量会更改,但 JTable 中没有任何变化。这是我的简单示例代码:

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" };
static JTable table;
static 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 static class Action implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        var = "ONE";
        System.out.println(var);
        String[] data = {"ciao"};
        tableModel.fireTableStructureChanged();
    }
}
}

有人可以帮我吗?谢谢!

你永远不会更改表模型的数据,所以 JTable 永远不会改变是有道理的。也许您想在模型上调用setValueAt(...)以更改其某个单元格所保存的值。执行此操作后,无需在模型上调用fireXxxx(...),因为这是由模型本身在内部调用的(并且应该)。

啊,我知道你做了什么。您认为通过更改var引用的字符串,JTable 的数据将神奇地改变,但这是神奇的想法,因为您所做的只是更改 var 变量引用的对象,并且您绝对没有影响它之前引用的字符串对象,并且显示在 JTable 中。这个问题涉及到Java的OOP模型的核心概念,即对象和引用变量之间的差异。更改变量引用对它所引用的对象没有影响。同样,调用模型上的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();
         }
      });
   }
}

最新更新