2015-06-08 4 views
0

Есть ли простой способ нагрузки данных из текстового файла, если спасительной данных из JTable в текстовый файл выглядит следующим образом:Загрузка данных из текстового файла в JTable

for (int row = 0; row < table.getRowCount(); row++) { 
        for (int col = 0; col < table.getColumnCount(); col++) { 
         out.println(table.getColumnName(col)); 
         out.print(": "); 
         out.println(table.getValueAt(row, col)); 

Или, может быть, это еще один способ хранить данные в JTable, если пользователь выйдет из программы и снова запустится?

Большое спасибо за помощь.

+0

При необходимости, код, пожалуйста, скажите мне – arkani

ответ

1

Вы можете изучить сериализацию JTable. Это встроенный процесс сохранения целого объекта в файл.

http://www.tutorialspoint.com/java/java_serialization.htm

+0

спасибо за подсказку. Я проверю это и помогу, если будет работать – arkani

+1

Возможно, вы не хотите использовать сериализацию. В API есть «предупреждение» для всех компонентов Swing, что сериализация не подходит для долговременного хранения, поскольку она не может быть совместима для выпуска для выпуска. Вместо этого вы должны использовать XMLEncoder. – camickr

+0

Я проверяю java docs и Jtable реализует java.io.Serializable, но JTableModel нет. Так, как вы говорите, я не могу использовать Serializable – arkani

1

С JDK 4 вы можете использовать XMLEncoder, чтобы обеспечить постоянное хранение и XMLDecoder для воссоздания объекта вы экономите. Вам необходимо создать PersistenceDelegate, чтобы помочь в кодировании и декодировании данных.

Вот пример для DefaultTableModel:

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 DefaultTableModelPersistenceDelegate2()); 
        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); 
    } 
} 

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

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

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

Приведенный выше код представляет собой более полный пример решения найдены в: How to write a JTable state with data in xml file using XMLEndcoder in java

Текстовая область в примере используется только, чтобы показать содержимое файла XML для сохраняемых данных.

Смежные вопросы