Loading Java JTable: Why does it not work?

后端 未结 3 999
故里飘歌
故里飘歌 2021-01-19 18:11

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 worki

相关标签:
3条回答
  • 2021-01-19 18:46

    Your new table is not added anywhere, so it will not show up. Try something like this:

    public void actionPerformed(ActionEvent e){
      JTable oldTable = table;
    
      // your stuff, loading the table from file
    
      thePanelHoldingYourTable.remove(oldTable);
      thePanelHoldingYourTable.add(table);
      // if there are other components in that panel, make sure, your table is in the right spot
      // maybe refresh your layout by using invalidate()
    }
    

    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):

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.SwingUtilities;
    import javax.swing.table.DefaultTableModel;
    
    public class Save3 extends JFrame implements ActionListener {
        private static final long serialVersionUID = 1L;
    
        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;
    
        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)},};
    
        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;
    
            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());
    
            model = new DefaultTableModel(data, columnNames);
            table = new JTable();
            table.setModel(model);
            table.setPreferredScrollableViewportSize(new Dimension(500, 70));
            table.setFillsViewportHeight(true);
            scrollPane = new JScrollPane(table);
    
            container.add(scrollPane, BorderLayout.CENTER);
            add(container);
        }
    
        public void setModel(DefaultTableModel writeModel) {
            table.setModel(writeModel);
        }
    
        public void actionPerformed(ActionEvent e) {
            System.out.println("Clicked item!");
            if (e.getSource() == menuNew) {
                System.out.println("New File");
            } else if (e.getSource() == menuSave) {
                System.out.println("Save!");
                try {
                    fos = new FileOutputStream(filename);
                    out = new ObjectOutputStream(fos);
                    table.clearSelection();
                    table.setModel(new DefaultTableModel());
                    out.writeObject(model);
                    table.setModel(model);
                } catch (IOException e3) {
                    e3.printStackTrace();
                } finally {
                    try {
                        out.close();
                        fos.close();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                }
            } else if (e.getSource() == menuOpen) {
                System.out.println("Open!");
                try {
                    fis = new FileInputStream(filename);
                    in = new ObjectInputStream(fis);
                    DefaultTableModel modelRead = (DefaultTableModel) in.readObject();
                    setModel(modelRead);
                    System.out.println("data loaded");
                    in.close();
                    fis.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                } catch (ClassNotFoundException e2) {
                    e2.printStackTrace();
                }
            } else if (e.getSource() == menuExit) {
                System.out.println("Exit!");
            }
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    Save3 ex = new Save3();
                    ex.setVisible(true);
                }
            });
        }
    }
    

    Please notice that I use the following three lines to serialize the model:

    table.setModel(new DefaultTableModel());
    out.writeObject(model);
    table.setModel(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.

    0 讨论(0)
  • 2021-01-19 18:50

    In the actionPerformed code, the imported table (this is a new instance) isn't added into a container.

    0 讨论(0)
  • 2021-01-19 19:00
    • JTable and its XxxTableModel is based on Vector or Object[]

    • have to load data from FileIO to the XxxTableModel in structure as is Vector or Object[]

    • all updates to the XxxTableModel must be done on EventDispatchThread, otherwise any changes are visible on the screen

    0 讨论(0)
提交回复
热议问题