【问题标题】:Changing one JTable changes other JTable in java更改一个 JTable 会更改 Java 中的其他 JTable
【发布时间】:2021-12-30 22:38:24
【问题描述】:

我正在制作一个需要许多 JTable 的程序。所以为了设置字体、列大小等。我使用的是这种方法:

public static void Enhance(JTable t){
        
       t.setRowHeight(70);
        DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
        centerRenderer.setHorizontalAlignment(JLabel.CENTER);
        t.setDefaultRenderer(String.class, centerRenderer);

        t.setAlignmentX(JTable.CENTER_ALIGNMENT);
     
        t.getModel().addTableModelListener(new TableModelListener() {
            @Override
            public void tableChanged(TableModelEvent e) {
                   resizeColumnWidth(t);
                    
            }
        });


        int index = 0;
        t.setAutoCreateColumnsFromModel(true);

        while (index < t.getColumnModel().getColumnCount()) {
            
            TableColumn a = t.getColumnModel().getColumn(index);
            a.setMinWidth(130);
            a.setPreferredWidth(130);


        

            index++;

        }
        JTextField textField = new JTextField();
textField.setFont(new Font("Open Sans", Font.PLAIN, 27));
textField.setBorder(new LineBorder(Color.BLACK));
DefaultCellEditor dce = new DefaultCellEditor( textField );
t.getColumnModel().getColumn(0).setCellEditor(dce);
for(int i =1 ; i<t.getColumnCount();i++){
    
    TableColumn sportColumn = t.getColumnModel().getColumn(i);
            JComboBox comboBox = new JComboBox();
            comboBox.setFont(new Font("Open Sans", Font.PLAIN,25));
            comboBox.addItem("Hulk- Maths");
            comboBox.addItem("THor - Computer");
            comboBox.addItem("Iron M- Geo");
            comboBox.addItem("Black P- History");
            comboBox.addItem("War M- Science");
            comboBox.addItem("Java  - Easy");
            comboBox.addItem("Custom");
            sportColumn.setCellEditor(new DefaultCellEditor(comboBox));
            comboBox.addItemListener(new ItemListener() {
        @Override
        public void itemStateChanged(ItemEvent e) {
            
             Object selectedItem = comboBox.getSelectedItem();
                boolean editable = selectedItem instanceof String && ((String)selectedItem).equals("Custom");
                comboBox.setEditable(editable);
        }
            });
            

}
     
t.setShowGrid(true);
        t.setFont(new Font("Open Sans",Font.PLAIN,25));
        t.getTableHeader().setFont(new Font("Open Sans", Font.PLAIN, 27));
        t.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
        t.setBackground(Color.WHITE);
        t.setSelectionBackground(new Color(172, 208, 252));
        t.setRowHeight(50);
        t.setSelectionForeground(Color.black);
        t.getTableHeader().setBackground(new Color(23, 180, 252));
        t.setGridColor(Color.lightGray);
        t.getTableHeader().setForeground(Color.white);
        
     
        
        
        
    }

我正在使用这样的方法:-

JTable t1 = new JTable(data1, title);//data is a String[][] Object and title is a String[] Object.

Enhance(t1);

这样我还有 4 张桌子。

但问题是当我对 t1 进行编辑时,JTable t2 也在发生变化。

如果我进入

"Java"

t1的第一个单元格中,t2的第一个单元格也将是

"Java" 

我该如何解决这个问题,以便对 t1 所做的编辑在 t2 中不可见?

编辑(调试细节):

即使这段代码也不起作用

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

/*
 * Made By JFan
 */

/**
 *
 * @author JFan
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        JFrame f = new JFrame();
        f.setSize(1000,1000);
        f.setLayout(null);
        
        String[][] data = {
            
            {"","","","",""},
            {"","","","",""},
            {"","","","",""},
            {"","","","",""},{"","","","",""}
        };
        String[] t = {
          "1","2","3","4","5"  
        };
        JTable t1 = new JTable(data,t);
        JScrollPane j = new JScrollPane(t1);
        j.setBounds(0, 200, 500, 500);
        f.add(j);
        
         JTable t2 = new JTable(data,t);
        f.add(j);
        
     
        
        JButton  b = new JButton("Click");
        b.setBounds(0,0,100,100);
        b.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
           
                j.setViewportView(t2);
                
            }
        });
        
        f.add(b);
           f.setVisible(true);
        
    }
    
}

【问题讨论】:

  • 使用以下步骤进行调试: 1) 创建一个 JFrame,其中包含两个表,每个表包含不同的数据。 2)然后创建一个不执行任何操作并重新测试的enhance(...) 方法。 3) 然后更改 "enhance() 逻辑以为两个表创建自定义渲染器并重新测试。4) 然后向enhance() 方法添加更多逻辑并重新测试。5) 当它停止工作时,您就会知道您刚刚更改了什么并且您可以解决问题或提出特定问题。重点是进行增量测试。更容易确定您的代码何时停止工作。此外,方法名称不应以大写开头。
  • 先生,我确实喜欢您所说的。然后它也不起作用。所以我删除了Enhance 方法。然后也改变一个jtable 正在改变另一个。我认为问题在于所有数据都是相同的。
  • 数组中的数据对于每个表来说都是相同的,这没关系。当您创建一个新的 JTable 时,会为每个表创建一个新的 TableModel。问题出在您未发布的代码中。发布适当的minimal reproducible example 来演示问题。所以你的 MRE 只是一个有两张桌子的框架。先让这个工作。我们应该能够复制/粘贴/编译/测试 MRE 以查看您描述的问题。
  • You were NOT asked for your complete code。您被要求提供minimal 示例。您需要先学习了解创建表的基础知识。正如我所说,它应该是一个有两张桌子的框架。类代码将是大约 20 行代码。几行来创建您的数据。几行来创建两个表。还有一些创建框架。学习基础知识,然后学习如何调试您编写的代码。我们无法帮助调试您的应用程序!
  • 你为什么要投票结束你自己的问题?我无法回答这个问题,因为它已关闭,因为您花了很长时间才发布 MRE。不要使用“数据数组”创建 JTable,而是使用数组创建 DefaultTableModel。然后使用模型创建 JTable。现在 Array 中的数据将分别复制到每个模型而不是共享。

标签: java swing jtable java-17


【解决方案1】:

不要使用:

JTable t2 = new JTable(data,t);

创建 JTable。这将创建一个使用 Array 作为数据存储的简单 TableModel。

正如您所注意到的,这个 Array 由所有表共享。

改为使用:

DefaultTableModel model = new DefaultTableModel(data, t);
JTable t2 = new JTable( model );

现在数组中的数据将被复制到 DefaultTableModel。

因此每个表都有自己的数据副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2011-08-06
    • 2013-08-16
    • 1970-01-01
    • 2014-08-24
    相关资源
    最近更新 更多