Search code examples
javaswingjtablejscrollpane

How do I change between two JTables?


So I have a JTable inside a JScrollPane inside a frame that works. What I want to do is to change the table that is being showed to another table that displays some other information and has more/less columns/rows. How do I do this?

I have tried stuff like putting another table in the ScrollPane but that doesn't work and if I re-put the ScrollPane in the frame it disappears.

EDIT:

I think this is all the code that has to do with this problem. I simply call the funktions to change the view.

    Object[][] userData = new Object[50][6];
    userTable = new JTable(userData, new String[] { "Namn", "Adress", 
            "Telefon", "Personnummer", "PIN", "Antal cyklar" }) {
        public boolean isCellEditable(int rowIndex, int colIndex) {
            return false;
        }
    };
    userTable.setSelectionMode(0);
    userTable.getTableHeader().setReorderingAllowed(false);
    Object[][] bikeData = new Object[50][7];
    bikeTable = new JTable(bikeData, new String[] { "Ägare", "Streckkod", 
            "Färg", "Märke", "Ram-nummer", "Senast hämtad", "Senast lämnad" }) {
        public boolean isCellEditable(int rowIndex, int colIndex) {
            return false;
        }
    };
    bikeTable.setSelectionMode(0);
    bikeTable.getTableHeader().setReorderingAllowed(false);
    JScrollPane tablePane = new JScrollPane(bikeTable);
    frame.add(tablePane);

    frame.setVisible(true);
}

public void displayUsers(){
    tablePane.setViewportView(userTable);
}

public void displayBikes(){
    tablePane.setViewportView(bikeTable);
}

Solution

  • Have you tried this:

    scrollPane.setViewportView(yourNewTable);
    

    This should replace the component displayed in the scroll pane. Of course you can always change the model of your JTable and its columns but that would not be my preference.

    EDIT: Here is a snippet demonstrating this:

    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Vector;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.event.TableModelListener;
    import javax.swing.table.TableModel;
    
    public class Test {
    
        public static void main(String... args) {
            JFrame frame = new JFrame();
            final Vector<String> string = new Vector<String>();
            final JTable table = new JTable(getTableModel("First", 1));
            final JTable table2 = new JTable(getTableModel("Second", 3));
            final JButton click = new JButton("Click me");
            final JScrollPane scrollPane = new JScrollPane(table);
            click.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (table2.getParent() == null) {
                        scrollPane.setViewportView(table2);
                    } else {
                        scrollPane.setViewportView(table);
                    }
                }
            });
            JPanel panel = new JPanel(new BorderLayout());
            panel.add(click, BorderLayout.EAST);
            panel.add(scrollPane);
            frame.getContentPane().add(panel);
            frame.pack();
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.setVisible(true);
        }
    
        private static TableModel getTableModel(final String prefix, final int colCount) {
            return new TableModel() {
    
                @Override
                public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
                    // TODO Auto-generated method stub
    
                }
    
                @Override
                public void removeTableModelListener(TableModelListener l) {
                    // TODO Auto-generated method stub
    
                }
    
                @Override
                public boolean isCellEditable(int rowIndex, int columnIndex) {
                    // TODO Auto-generated method stub
                    return false;
                }
    
                @Override
                public Object getValueAt(int rowIndex, int columnIndex) {
                    return prefix + "Hello cell (" + rowIndex + "," + columnIndex + ")";
                }
    
                @Override
                public int getRowCount() {
                    return 30;
                }
    
                @Override
                public String getColumnName(int columnIndex) {
                    return "Column " + columnIndex;
                }
    
                @Override
                public int getColumnCount() {
                    return colCount;
                }
    
                @Override
                public Class<?> getColumnClass(int columnIndex) {
                    return String.class;
                }
    
                @Override
                public void addTableModelListener(TableModelListener l) {
                    // TODO Auto-generated method stub
    
                }
            };
        }
    
    }