 |
-- Main.aberrant - 07 May 2008
Second attempt at a column model demo.
import java.awt.BorderLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.HashMap;
import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
/**
* ColumnDemo
*
* This demo application is intended to explain the basics of manipulating a
* column model. It covers the adding and removing of columns from a column
* model.
*
* @author Collin Fagan
*/
public class ColumnDemo extends JPanel {
private static final long serialVersionUID = 1L;
private JTable table = new JTable();
/**
* A hash table to store the "hidden" columns so that they can be restored
* later.
*/
private HashMap<String, TableColumn> hiddenColumns = new HashMap<String, TableColumn>();
/**
* sample data column names
*/
private String[] columnNames = { "First Name", "Last Name", "Sport",
"# of Years", "Vegetarian" };
/**
* sample table data
*/
private Object[][] data = {
{ "Mary", "Campione", "Snowboarding", 5, Boolean.FALSE },
{ "Alison", "Huml", "Rowing", 3, Boolean.FALSE },
{ "Kathy", "Walrath", "Knitting", 2, Boolean.FALSE },
{ "Sharon", "Zakhour", "Speed reading", 20, Boolean.FALSE },
{ "Philip", "Milne", "Pool", 10, Boolean.FALSE } };
/**
* Start the demo on the Event Dispatch Thread.
*
* @param args
* the command line arguments
*/
public static void main(String[] args) {
// turn bold fonts off in metal
UIManager.put("swing.boldMetal", Boolean.FALSE);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame demoFrame = new JFrame();
demoFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
demoFrame.setContentPane(new ColumnDemo());
demoFrame.pack();
demoFrame.setVisible(true);
}
});
}
/**
* Constructor that creates a the table model and sets up the demo.
*/
public ColumnDemo() {
DefaultTableModel model = new DefaultTableModel(data, columnNames);
table.setModel(model);
setLayout(new BorderLayout());
JScrollPane scrollPane = new JScrollPane(table);
table.setFillsViewportHeight(true);
add(scrollPane, BorderLayout.CENTER);
add(createColumnSelectionPanel(table.getColumnModel()),
BorderLayout.WEST);
}
/**
* createColumnSelectionPanel() - Creates a panel containing a check box
* corresponding to each column in the table model. When a check box is
* selected the column appears in the table. When a check box is deselected
* the column is removed.
*
* @param columnModel
* @return
*/
private JComponent createColumnSelectionPanel(TableColumnModel columnModel) {
JPanel selectionPanel = new JPanel();
selectionPanel
.setLayout(new BoxLayout(selectionPanel, BoxLayout.Y_AXIS));
for (int i = 0; i < columnModel.getColumnCount(); i++) {
JCheckBox checkBox = new JCheckBox(columnModel.getColumn(i)
.getHeaderValue().toString());
checkBox.setSelected(true);
checkBox.addItemListener(columnDisplayChanged);
selectionPanel.add(checkBox);
}
return selectionPanel;
}
/**
* An item listener who's job is to add and remove a column from the column
* model. When a column is removed it's stored in a hashmap for later
* retrival.
*/
private ItemListener columnDisplayChanged = new ItemListener() {
/**
* @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent)
*/
public void itemStateChanged(ItemEvent e) {
JCheckBox checkBox = (JCheckBox) e.getSource();
TableColumnModel columnModel = table.getColumnModel();
if (checkBox.isSelected()) {
TableColumn column = hiddenColumns.get(checkBox.getText());
if (column != null) {
columnModel.addColumn(column);
int prefIndex = column.getModelIndex();
/*
* When placing a column back in the model it should attempt
* to place column back into it's original spot. If that
* spot does not exist then add it to the end.
*/
if (prefIndex < columnModel.getColumnCount()) {
columnModel.moveColumn(
columnModel.getColumnCount() - 1, prefIndex);
}
}
} else {
TableColumn column = table.getColumn(checkBox.getText());
columnModel.removeColumn(column);
hiddenColumns.put(checkBox.getText(), column);
}
}
};
}
|