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

Posted

技术标签:

【中文标题】Java - 方法更改 JTable 中变量的值(刷新不起作用)【英文标题】:Java - Method changes value of variable in JTable (refresh not working) 【发布时间】: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();
    


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

【问题讨论】:

【参考方案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();
         
      );
   

【讨论】:

以上是关于Java - 方法更改 JTable 中变量的值(刷新不起作用)的主要内容,如果未能解决你的问题,请参考以下文章

JTable 单元格更新不起作用

JAVA中怎么把list或map里的值动态添加至JTable

java 怎么更改final的值

在jTable(自动保存)中编辑后,如何将单元格中的数据保存在sql中?

JTable里怎么得到修改后单元格里的值

从数据库表中添加 JTable 中的值