/*
* SaveAndRestoreJTableLayoutExample.java
*
* Created on 30. April 2008, 20:39
*/
package de.tutorials.training;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.Set;
import java.util.TreeSet;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
/**
*
* @author Tom
*/
public class SaveAndRestoreJTableLayoutExample extends javax.swing.JFrame {
public final static String LAYOUT_DESCRIPTOR = "table-layout.xml";
/** Creates new form SaveAndRestoreJTableLayoutExample */
public SaveAndRestoreJTableLayoutExample() {
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
scrollPane = new javax.swing.JScrollPane();
table = new javax.swing.JTable();
btnSaveLayout = new javax.swing.JButton();
btnRestoreLayout = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("SaveAndrestoreJTableLayoutExample");
table.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{new Boolean(true), "a", "1", "A"},
{null, "b", "2", "B"},
{new Boolean(true), "c", "3", "C"},
{null, "d", "4", "D"}
},
new String [] {
"Column0", "Column1", "Column2", "Column3"
}
) {
Class[] types = new Class [] {
java.lang.Boolean.class, java.lang.String.class, java.lang.Object.class, java.lang.String.class
};
public Class getColumnClass(int columnIndex) {
return types [columnIndex];
}
});
scrollPane.setViewportView(table);
btnSaveLayout.setText("Save Layout");
btnSaveLayout.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnSaveLayoutActionPerformed(evt);
}
});
btnRestoreLayout.setText("RestoreLayout");
btnRestoreLayout.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnRestoreLayoutActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(scrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 399, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(btnSaveLayout)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnRestoreLayout)
.addContainerGap(183, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(scrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(btnSaveLayout)
.addComponent(btnRestoreLayout))
.addContainerGap())
);
pack();
}// </editor-fold>
private void btnSaveLayoutActionPerformed(java.awt.event.ActionEvent evt) {
TableColumnModel tableColumnModel = this.table.getColumnModel();
final Set<TableColumnLayoutInfo> tableColumnLayoutInfos = new TreeSet<TableColumnLayoutInfo>();
for (int currentColumnIndex = 0; currentColumnIndex < tableColumnModel.getColumnCount(); currentColumnIndex++) {
TableColumn tableColumn = tableColumnModel.getColumn(currentColumnIndex);
TableColumnLayoutInfo tableColumnLayoutInfo = new TableColumnLayoutInfo(tableColumn.getIdentifier().toString(),
tableColumnModel.getColumnIndex(tableColumn.getIdentifier()), tableColumn.getWidth());
tableColumnLayoutInfos.add(tableColumnLayoutInfo);
}
try {
XMLEncoder xmlEncoder = new XMLEncoder(new FileOutputStream(LAYOUT_DESCRIPTOR));
xmlEncoder.writeObject(tableColumnLayoutInfos);
xmlEncoder.close();
} catch (IOException exception) {
exception.printStackTrace();
}
}
private void btnRestoreLayoutActionPerformed(java.awt.event.ActionEvent evt) {
try {
XMLDecoder xmlDecoder = new XMLDecoder(new FileInputStream(LAYOUT_DESCRIPTOR));
Set<TableColumnLayoutInfo> tableColumnLayoutInfos = (Set<TableColumnLayoutInfo>) xmlDecoder.readObject();
xmlDecoder.close();
TableColumnModel tableColumnModel = new DefaultTableColumnModel();
for (TableColumnLayoutInfo tableColumnLayoutInfo : tableColumnLayoutInfos) {
TableColumn tableColumn = table.getColumn(tableColumnLayoutInfo.getColumnName());
tableColumn.setPreferredWidth(tableColumnLayoutInfo.getWidth());
tableColumnModel.addColumn(tableColumn);
}
this.table.setColumnModel(tableColumnModel);
} catch (Exception exception) {
exception.printStackTrace();
}
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new SaveAndRestoreJTableLayoutExample().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton btnRestoreLayout;
private javax.swing.JButton btnSaveLayout;
private javax.swing.JScrollPane scrollPane;
private javax.swing.JTable table;
// End of variables declaration
public static class TableColumnLayoutInfo
implements Serializable, Comparable<TableColumnLayoutInfo> {
public int compareTo(TableColumnLayoutInfo o) {
return order - o.order;
}
private int order;
private String columnName;
private int width;
public TableColumnLayoutInfo() {
}
public TableColumnLayoutInfo(String columnName, int order, int width) {
this.columnName = columnName;
this.order = order;
this.width = width;
}
public int getOrder() {
return order;
}
public void setOrder(int order) {
this.order = order;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public String getColumnName() {
return columnName;
}
public void setColumnName(String columnName) {
this.columnName = columnName;
}
}
}