将Interactive JTable的内容保存到.txt文件,以便在下次运行时读取它

嘿伙计我正在编写一个向用户显示JTable的程序,因此他们可以将一些数据输入到表窗口中。 问题是,我无法弄清楚如何保存任何数据,因此可以在再次运行应用程序时重新打开数据。 我希望在关闭应用程序时自动保存数据,但如果需要,我很乐意使用按钮。

我无法弄清楚如何保存任何数据,

从JTable API(和所有Swing组件),您将看到:

警告:此类的序列化对象与以后的Swing版本不兼容….从1.4开始,java.beans包中添加了对所有JavaBeans™的长期存储的支持。 请参阅XMLEncoder。

以下是使用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 columnNames = new Vector(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)); } } }