I have created a simple GUI which includes a JTable. This table may be saved & loaded via the appropriate Object Stream.
At this point the Save function is working as intended, and I can see the table object is stored in a file when looking in the save directory.
However, when I try to load the table from the file, the GUI never displays the loaded table. The actionlistener function is called, as I have a system.out “Data loaded”, but the table never displays updated data.
I have tried to call repaint(), but to no avail. To anyone who can shed some light on what I may be doing wrong, I would be most grateful.
A look at some code
import javax.swing.*;
import java.awt.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.imageio.*;
import java.io.*;
import java.awt.image.BufferedImage;
import java.util.*;
import javax.swing.table.*;
import java.awt.event.*;
public class Save3 extends JFrame implements ActionListener{
public int PADDING = 10;
public JMenuItem menuNew;
public JMenuItem menuOpen;
public JMenuItem menuSave;
public JMenuItem menuExit;
public JPanel container;
public DefaultTableModel model;
public JScrollPane scrollPane;
public JTable table;
public FileInputStream fis;
public ObjectInputStream in;
public FileOutputStream fos;
public ObjectOutputStream out;
public String filename;
public Save3(){
fis = null;
in = null;
fos = null;
out = null;
filename = "test.ref";
initGUI();
}
public void initGUI(){
setTitle("WIM Reference Data Comparison Tool");
setSize(500, 400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
// Menu Bar and Menu Items setup
JMenuBar menuBar;
JMenu menu;
JMenuItem menuItem;
menuBar = new JMenuBar();
menu = new JMenu("Menu");
menuBar.add(menu);
menuNew = new JMenuItem("New");
menuOpen = new JMenuItem("Open");
menuSave = new JMenuItem("Save");
menuExit = new JMenuItem("Exit");
menuNew.addActionListener(this);
menuOpen.addActionListener(this);
menuSave.addActionListener(this);
menuExit.addActionListener(this);
menu.add(menuNew);
menu.add(menuOpen);
menu.add(menuSave);
menu.add(menuExit);
setJMenuBar(menuBar);
container = new JPanel(new BorderLayout());
String[] columnNames = {"", "MotorBike", " Car"};
Object[][] data = { {"Vehicle Summary", new Integer(100), new Integer(200)}, // Header 1: Green
{"Axle Numbers", new Integer(100), new Integer(200)},
{"Axle Code", new Integer(100), new Integer(200)},
{"Axle Distances (cm)", new Integer(100), new Integer(200)},
{"Vehicle Speed (km/h)", new Integer(100), new Integer(200)},
{"Gross Weight", new Integer(100), new Integer(200)},
{"Axle Weight 1", new Integer(100), new Integer(200)},
{"Axle Weight 2", new Integer(100), new Integer(200)},
};
model = new DefaultTableModel(data, columnNames);
table = new JTable(data, columnNames);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);
scrollPane = new JScrollPane(table);
container.add(scrollPane, BorderLayout.CENTER);
add(container);
}
public void setPanel(JTable table){
scrollPane.remove(table);
container.remove(scrollPane);
scrollPane = new JScrollPane(table);
container.add(scrollPane, BorderLayout.CENTER);
repaint();
}
public void actionPerformed(ActionEvent e){
System.out.println("Clicked item!");
// NEW
if(e.getSource() == menuNew){
System.out.println("New File");
}
// SAVE
if(e.getSource() == menuSave){
System.out.println("Save!");
try{
model.fireTableDataChanged();
table = new JTable(model);
fos = new FileOutputStream(filename);
out = new ObjectOutputStream(fos);
out.writeObject(table);
}catch(IOException e3){
e3.printStackTrace();
}
}
if(e.getSource() == menuOpen){
System.out.println("Open!");
JTable table = new JTable();
try{
fis = new FileInputStream(filename);
in = new ObjectInputStream(fis);
table = new JTable();
table = (JTable) in.readObject();
in.close();
setPanel(table);
System.out.println("data loaded");
}catch(IOException e1){
e1.printStackTrace();
}catch(ClassNotFoundException e2){
e2.printStackTrace();
}
}
if(e.getSource() == menuExit){
System.out.println("Exit!");
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Exception e) {
e.printStackTrace();
}
Save3 ex = new Save3();
ex.setVisible(true);
}
});
}
}
Your new table is not added anywhere, so it will not show up. Try something like this:
EDIT: Ok, serializing the table is not really advised, it is better to only save the table model. Here is your edited SSCCE (thanks to kleopatra for the help):
Please notice that I use the following three lines to serialize the model:
So the model is detached from the table while serializing. Unfortunately the model tries to serialize its listeners as well (which fails). That’s why this step is neccessary. Once saved, the model can be applied to the table again.