Saving content of Interactive JTable to .txt file to read it upon next run

后端 未结 1 1307
遥遥无期
遥遥无期 2020-12-22 14:08

Hey guys I am currently writing a program that displays a JTable to the user, so they can input some data into the table window. Problem is, I can\'t figure out how to save

相关标签:
1条回答
  • 2020-12-22 14:58

    I can't figure out how to save any data,

    From the JTable API (and all Swing components) you will see:

    Warning: Serialized objects of this class will not be compatible with future Swing releases .... As of 1.4, support for long term storage of all JavaBeans™ has been added to the java.beans package. Please see XMLEncoder.

    Here is an example using XMLEncoder:

    //  Following code is a more complete version of:
    //  http://stackoverflow.com/q/26250939/131872
    
    import java.awt.*;
    import java.awt.event.*;
    import java.beans.*;
    import java.io.*;
    import java.util.Vector;
    import javax.swing.*;
    import javax.swing.table.*;
    
    public class DefaultTableModelPersistenceDelegateTest
    {
        private File file = new File("TableModel.xml");
        private final JTextArea textArea = new JTextArea();
    
        private final String[] columnNames = {"Column1", "Column2"};
    
        private final Object[][] data =
        {
            {"aaa", new Integer(1)},
            {"bbb\u2600", new Integer(2)}
        };
    
        private DefaultTableModel model = new DefaultTableModel(data, columnNames);
        private final JTable table = new JTable(model);
    
        public JComponent makeUI()
        {
            model.setColumnCount(5);
            JSplitPane sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
            sp.setResizeWeight(.3);
            sp.setTopComponent(new JScrollPane(table));
            sp.setBottomComponent(new JScrollPane(textArea));
    
            JPanel p = new JPanel();
            p.add(new JButton(new AbstractAction("XMLEncoder")
            {
                @Override
                public void actionPerformed(ActionEvent e)
                {
                    try
                    {
                        OutputStream os = new BufferedOutputStream(new FileOutputStream(file));
                        XMLEncoder xe = new XMLEncoder(os);
                        xe.setPersistenceDelegate(DefaultTableModel.class, new DefaultTableModelPersistenceDelegate());
                        xe.writeObject(model);
                        xe.close();
    
                        Reader r = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
                        textArea.read(r, null);
                    }
                    catch (IOException ex)
                    {
                        ex.printStackTrace();
                    }
                }
            }));
    
            p.add(new JButton(new AbstractAction("XMLDecoder")
            {
                @Override
                public void actionPerformed(ActionEvent e)
                {
                    try
                    {
                        InputStream is = new BufferedInputStream( new FileInputStream( file ));
                        XMLDecoder xd = new XMLDecoder(is);
                        model = (DefaultTableModel)xd.readObject();
                        table.setModel(model);
                    }
                    catch (IOException ex)
                    {
                        ex.printStackTrace();
                    }
                }
            }));
    
            p.add(new JButton(new AbstractAction("clear")
            {
                @Override
                public void actionPerformed(ActionEvent e)
                {
                    model = new DefaultTableModel();
                    table.setModel(model);
                }
            }));
    
            JPanel pnl = new JPanel(new BorderLayout());
            pnl.add(sp);
            pnl.add(p, BorderLayout.SOUTH);
            return pnl;
        }
    
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                @Override public void run()
                {
                    createAndShowGUI();
                }
            });
        }
    
        public static void createAndShowGUI()
        {
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            f.getContentPane().add(new DefaultTableModelPersistenceDelegateTest().makeUI());
            f.setSize(420, 340);
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    }
    
    //  See following link for more information on Using XMLEncoder:
    //  http://www.oracle.com/technetwork/java/persistence4-140124.html
    
    class DefaultTableModelPersistenceDelegate extends DefaultPersistenceDelegate
    {
        //  Initially creates an empty DefaultTableModel. The columns are created
        //  and finally each row of data is added to the model.
    
        @Override
        protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder encoder)
        {
            DefaultTableModel model= (DefaultTableModel)oldInstance;
    
            //  Create XML to restore the column names
    
            Vector<String> columnNames = new Vector<String>(model.getColumnCount());
    
            for (int i = 0; i < model.getColumnCount(); i++)
            {
                columnNames.add( model.getColumnName(i) );
            }
    
            Object[] columnNamesData = new Object[] { columnNames };
            encoder.writeStatement(new Statement(oldInstance, "setColumnIdentifiers", columnNamesData));
    
            //  Create XML to restore row data
    
            Vector row = model.getDataVector();
    
            for (int i = 0; i < model.getRowCount(); i++)
            {
                Object[] rowData = new Object[] { row.get(i) };
                encoder.writeStatement(new Statement(oldInstance, "addRow", rowData));
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题