【问题标题】:Java - Method changes value of variable in JTable (refresh not working)Java - 方法更改 JTable 中变量的值(刷新不起作用)
【发布时间】:2015-03-20 16:09:12
【问题描述】:

我有一个 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();
    }
}
}

有人可以帮帮我吗? 谢谢!

【问题讨论】:

    标签: java swing jtable refresh defaulttablemodel


    【解决方案1】:

    您根本不会更改 tableModel 的数据,因此 JTable 永远不会更改是有道理的。也许您想在模型上调用setValueAt(...) 来更改其中一个单元格所持有的值。完成此操作后,无需在模型上调用 fireXxxx(...),因为这是(并且应该)由模型本身在内部调用。

    啊,我明白你做了什么。您认为通过更改 var 引用的字符串,JTable 的数据会神奇地改变,但这是神奇的想法,因为您所做的只是更改 var 变量引用的对象,而您绝对拥有对它之前引用的且在 JTable 中显示的 String 对象没有影响。这个问题涉及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();
             }
          });
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      相关资源
      最近更新 更多