java - jTable.setModel() 未按预期工作

标签 java swing jtable tablemodel

我创建了一个内部框架,主要包含一个 jlist 和一个 jtable。

我要做的是,当用户在 jList 中选择一个政党或一组政党时,该表应包含一个包含所选政党名称的列并将其添加到 jTable 中。 Default jTable

我所实现的将初始 tableModel 存储在一个对象中,每次用户在 jList 选择中进行更改时,它都会首先将表模型更改为存储的对象,然后根据新的选择进行更改。 Table After First Selection

问题是定义的 jTable1.setModel() 方法不起作用。 Errorunous table after Second Selection

PS:未使用的代码已删除。问题仅包含导致错误的代码段。完整文件可见:Here

import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class DispatchPlanningSelfContained extends javax.swing.JFrame {

    DefaultTableModel defaultdtm;
    public DispatchPlanningSelfContained() {
        initComponents();
        defaultdtm = (DefaultTableModel) jTable1.getModel();
        jList1.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                if(!e.getValueIsAdjusting()){
                    //I use either of below method each time
                    jTable1.setModel((TableModel)defaultdtm);// This Doesn't set the tablemodel to default one (I expect this to set the table as Image 1)
                    jTable1.setModel(defaultdtm);// This too Doesn't set the tablemodel to default one

                    DefaultTableModel dtm = (DefaultTableModel) jTable1.getModel();

                    int selection[] = jList1.getSelectedIndices();
                    System.out.println("Selection Length = " + selection.length);
                    for(int i = 0; i < selection.length; i++){
                        dtm.addColumn(jList1.getModel().getElementAt(selection[i]));
                            System.out.println("selection [" + i + "] = " + jList1.getModel().getElementAt(selection[i]));
                    }
                }
            }
        });
    }
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jLabel4 = new javax.swing.JLabel();
        jScrollPane3 = new javax.swing.JScrollPane();
        jList1 = new javax.swing.JList<>();
        jLabel5 = new javax.swing.JLabel();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel4.setText("Pending Party Names");

        jList1.setModel(new javax.swing.AbstractListModel<String>() {
            String[] strings = { "Party 1", "Party 2", "Party 3", "Party 4", "Party 5", "Party 6", "Party 7", "Party 8", "Party 9" };
            public int getSize() { return strings.length; }
            public String getElementAt(int i) { return strings[i]; }
        });
        jScrollPane3.setViewportView(jList1);

        jLabel5.setText("Planning Results:");

        jTable1.setAutoCreateRowSorter(true);
        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Code", "Description", "Rulling", "Page", "MRP", "QPC", "Total Order", "Stock", "Shortage"
            }
        ));
        jScrollPane2.setViewportView(jTable1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 967, Short.MAX_VALUE)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jScrollPane2)
                        .addGroup(layout.createSequentialGroup()
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(layout.createSequentialGroup()
                                    .addGap(268, 268, 268)
                                    .addComponent(jLabel4))
                                .addComponent(jLabel5))
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 531, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 52, Short.MAX_VALUE)))
                    .addContainerGap()))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 585, Short.MAX_VALUE)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(jLabel4)
                            .addGap(96, 96, 96)
                            .addComponent(jLabel5))
                        .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap()))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new DispatchPlanningSelfContained().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JList<String> jList1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JTable jTable1;
    // End of variables declaration//GEN-END:variables
}

最佳答案

问题从这里开始,其背后的假设是:

DefaultTableModel dtm = (DefaultTableModel) jTable1.getModel();

代码似乎将 dtm 视为初始表模型的副本,而现在它只是引用它。

最简单的修复方法是在每次更改时使用原始数据初始化表模型:

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class DispatchPlanningSelfContained extends JFrame {

    Object[][] data = new Object[][]{};
    String[] titles = {
        "Code", "Description", "Rulling", "Page", 
        "MRP", "QPC", "Total Order", "Stock", "Shortage"
    };

    public DispatchPlanningSelfContained() {
        initComponents();
        jList1.addListSelectionListener((ListSelectionEvent e) -> {
            if (!e.getValueIsAdjusting()) {
                DefaultTableModel dtm = new DefaultTableModel(data, titles);

                int selection[] = jList1.getSelectedIndices();
                System.out.println("Selection Length = " + selection.length);
                for (int i = 0; i < selection.length; i++) {
                    dtm.addColumn(jList1.getModel().getElementAt(selection[i]));
                    System.out.println("selection [" + i + "] = " + 
                            jList1.getModel().getElementAt(selection[i]));
                }
                jTable1.setModel(dtm);
            }
        });
    }

    @SuppressWarnings("unchecked")
    private void initComponents() {

        jLabel4 = new JLabel();
        jScrollPane3 = new JScrollPane();
        jList1 = new JList<>();
        jLabel5 = new JLabel();
        jScrollPane2 = new JScrollPane();
        jTable1 = new JTable();

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        jLabel4.setText("Pending Party Names");

        jList1.setModel(new AbstractListModel<String>() {
            String[] strings = {
                "Party 1", "Party 2", "Party 3", "Party 4", 
                "Party 5", "Party 6", "Party 7", "Party 8", "Party 9"
            };

            @Override
            public int getSize() {
                return strings.length;
            }

            @Override
            public String getElementAt(int i) {
                return strings[i];
            }
        });
        jScrollPane3.setViewportView(jList1);

        jLabel5.setText("Planning Results:");

        jTable1.setAutoCreateRowSorter(true);
        jTable1.setModel(new DefaultTableModel(data, titles));
        jScrollPane2.setViewportView(jTable1);

        GroupLayout layout = new GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
                layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addGap(0, 967, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup()
                                .addContainerGap()
                                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                                        .addComponent(jScrollPane2)
                                        .addGroup(layout.createSequentialGroup()
                                                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                                                        .addGroup(layout.createSequentialGroup()
                                                                .addGap(268, 268, 268)
                                                                .addComponent(jLabel4))
                                                        .addComponent(jLabel5))
                                                .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                                                .addComponent(jScrollPane3, GroupLayout.PREFERRED_SIZE, 531, GroupLayout.PREFERRED_SIZE)
                                                .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 52, Short.MAX_VALUE)))
                                .addContainerGap()))
        );
        layout.setVerticalGroup(
                layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addGap(0, 585, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup()
                                .addContainerGap()
                                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                                        .addGroup(layout.createSequentialGroup()
                                                .addComponent(jLabel4)
                                                .addGap(96, 96, 96)
                                                .addComponent(jLabel5))
                                        .addComponent(jScrollPane3, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(jScrollPane2, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                                .addContainerGap()))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(() -> {
            new DispatchPlanningSelfContained().setVisible(true);
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private JLabel jLabel4;
    private JLabel jLabel5;
    private JList<String> jList1;
    private JScrollPane jScrollPane2;
    private JScrollPane jScrollPane3;
    private JTable jTable1;
    // End of variables declaration//GEN-END:variables
}

关于java - jTable.setModel() 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60954857/

相关文章:

java - 如何更改JPanel的背景图片

java - 我的登录验证码有什么问题?我正在使用 Java Swing 和 MySQL

java - 声明一个数组的最简单方法是什么,该数组与另一个数组具有相同的值,但多了一个位置?

java - Firebase (Android) - 将过滤后的数据加载到自定义 ArrayList 中

java - 位于 ButtonGroup 中的 JradioButton 要 setSelected

java - 将多个 JTable 作为一个作业打印——Book 对象仅打印第一个表

java - JTable 列名称

java - 从 MySQL 数据库中检索数据并在 JTable 中显示

java - 以 XML 格式导出 SQLite 表

java - Java 中的内部静态类