2015-11-07 100 views
0

我正在尝试保存从JTable(类型AbstractTableModel)编辑的行到文件中。我不知道如何做到这一点;或者使用ObjectOutput和InputStream。如何将AbstractTableModel保存到文件中?

此外,我想加载然后,从另一个JTable保存时。为了给你一个更好的图片,我正在做一个EPOS系统,用户可以在其中编辑行数据(数量),并且当程序正在执行时,发现数量不为零时,它会保存整行当前的细节)放入一个文件中。这是为了让用户有一个已经下单的记录(对于EPOS和库存中的销售功能)。

当用户点击确认按钮时,希望能够触发保存部分。

有人可以帮我吗?谢谢

+1

我不推荐对象流(或几乎任何东西)。一个简单而直接的方法是将它们保存为简单的CSV行。 – Kayaman

+0

可以请你告诉我怎么做 –

+0

我指导你进入[基本I/O教程](https://docs.oracle.com/javase/tutorial/essential/io/)。 – Kayaman

回答

1

如果您阅读JTable API,您会发现它建议您长期存储使用XMLEncoder

我想

您没有使用AbstractTableModel的从一个JTable(类型AbstractTableModel上)保存编辑后的行。 AbstractTableModel不提供任何数据存储。您正在使用扩展AbstractTableModel的TableModel。假设你正在使用这里的DefaultTableModel是一个例子,可以让你使用XMLEncoder和的XMLDecoder:如果你不使用的DefaultTableModel,那么你将需要创建自己的PersistenceDelegate

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

class DefaultTableModelPersistenceDelegate2 extends DefaultPersistenceDelegate 
{ 
    // Initially creates a DefaultTableModel with rows and columns. Then the 
    // columns are reset and proper names are used. Finally data is set for each 
    // cell in the model. 

    @Override 
    protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder encoder) 
    { 
     super.initialize(type, oldInstance, newInstance, 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 reset the value of every cell to its value 

     for (int row = 0; row < model.getRowCount(); row++) 
     { 
      for (int col = 0; col < model.getColumnCount(); col++) 
      { 
       Object[] o = new Object[] {model.getValueAt(row, col), row, col}; 
       encoder.writeStatement(new Statement(oldInstance, "setValueAt", o)); 
      } 
     } 
    } 
}