Arpit Porwal
Arpit Porwal

Reputation: 30

jTable.setModel() doesn't work as expected

I've created an internal frame that primarily holds a jlist and a jtable.

What I've to do is when the user selects a party or a group of parties in jList, the table should include a column with the selected party name and add it to jTable.Default jTable

What I have implemented will store the initial tableModel in an object, and every time the user makes changes in jList selection, it will first change the table model to the stored object and then will make changes according to the new selection.Table After First Selection

The problem is that the defined jTable1.setModel() method doesn't work. Errorunous table after Second Selection

PS : Unused Code is Removed. The Problem Contains only the piece of code causing errors. Complete File can be seen at : 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
}

Upvotes: 0

Views: 3184

Answers (1)

Andrew Thompson
Andrew Thompson

Reputation: 168845

The problem starts here, with the assumptions underlying it:

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

The code seems to be treating dtm as a copy of the initial table model, whereas it now simply refers to it.

The easiest fix is to initialize the table model with the raw data each time it's changed:

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
}

Upvotes: 1

Related Questions