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);
}
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
}
};
}
}