The Source for Java Technology Collaboration


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

Topic JTableColumnsDemo . { Edit | Ref-By | Printable | Diffs r4 < r3 < r2 < r1 | More }
 XML java.net RSS

  

Revision r4 - 2008-05-18 - 13:42:18 - aberrant
Parents: WebHome > Javatutorials