JTable Inhalte speichern

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen

TableSave.jpg

Dieses Beispiel zeigt, wie wir den Zustand einer JTable speichern können (Daten, Spaltenbreite und -position), so dass sie nach einem Programmneustart wieder geladen werden kann.

/*
 * TableSave.java
 */

import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import java.io.*;
import javax.swing.*;

public class TableSave extends JFrame {

    private JTable table;
    private MyTableModel tableModel;
    private MyColumnModel columnModel;
    private String filename = "TableSaveColumns.xml";

    public TableSave() {
        super("TableSaveColumns");
        setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
        setSize(400, 300);
        setLocationRelativeTo(null);
        table = new JTable();
        getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
        //TableModel:
        tableModel = new MyTableModel();
        table.setModel(tableModel);
        //ColumnModel:
        columnModel = new MyColumnModel();
        table.setColumnModel(columnModel);
        //initialize:
        tableModel.addRow(new Object[]{new Integer(101), "2a", "3a", "4a"});
        tableModel.addRow(new Object[]{new Integer(102), "2b", "3b", "4b"});
        loadTable();
        //listener:
        addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(final WindowEvent evt) {
                saveTable();
                dispose();
            }
        });
    }

    private void saveTable() {
        try {
            XMLEncoder o = new XMLEncoder(new BufferedOutputStream(new FileOutputStream(filename)));
            o.writeObject(tableModel);
            o.writeObject(columnModel);
            o.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private boolean loadTable() {
        try {
            XMLDecoder d = new XMLDecoder(new BufferedInputStream(new FileInputStream(filename)));
            tableModel = (MyTableModel) d.readObject();
            table.setModel(tableModel);
            columnModel = (MyColumnModel) d.readObject();
            table.setColumnModel(columnModel);
            d.close();
        } catch (FileNotFoundException ex) {
            return false;
        }
        return true;
    }

    public static void main(final String args[]) {
        EventQueue.invokeLater(new Runnable() {

            public void run() {
                new TableSave().setVisible(true);
            }
        });
    }
}
/*
 * MyTableModel.java
 * is a bean that can be saved/loaded using XMLEncoder/XMLDecoder.
 * A bean must always have a default constructor (without parameters)
 * and getters/setters for the attributes. It must be a "public" class.
 */

import java.util.Vector;
import javax.swing.table.DefaultTableModel;

public class MyTableModel extends DefaultTableModel {

    //the default constructor is needed (there is no default constructor in DefaultTableModel):
    public MyTableModel() {
        super(0, 4);
    }

    //this setter is needed because it is missing in DefaultTableModel:
    public void setDataVector(Vector vector) {
        dataVector = vector;
    }

    //this getter is needed because it is missing in DefaultTableModel:
    public Vector getColumnIdentifiers() {
        return columnIdentifiers;
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        if (columnIndex == 0) {
            return Integer.class;
        }
        return String.class;
    }
}


/*
 * MyColumnModel.java
 * is a bean that can be saved/loaded using XMLEncoder/XMLDecoder
 * A bean must always have a default constructor (without parameters)
 * and getters/setters for the attributes. It must be a "public" class.
 */

import java.util.*;
import javax.swing.table.*;

public class MyColumnModel extends DefaultTableColumnModel {

    private Object[] columnData = new Object[]{
        "Title 1", 100, //column 1: header value, width
        "Title 2", 50, //column 2: header value, width
        "Title 3", 50, //column 3: header value, width
        "Title 4", 50 //column 4: header value, width
    };

    public MyColumnModel() {
        super();
        for (int i = 0; i < columnData.length; i += 2) {
            String title = (String) columnData[i];
            Integer width = (Integer) columnData[i + 1];
            TableColumn tableColumn = new TableColumn(i / 2, width);
            tableColumn.setHeaderValue(title);
            addColumn(tableColumn);
        }
    }

    //this getter is needed because it is missing in DefaultTableColumnModel:
    public Vector<TableColumn> getTableColumns() {
        return tableColumns;
    }

    //this setter is needed because it is missing in DefaultTableColumnModel:
    public void setTableColumns(Vector<TableColumn> tableColumns) {
        this.tableColumns = tableColumns;
    }
}