The Source for Java Technology Collaboration


-- Main.aberrant - 20 May 2008 Here is a small rework of the Frozen column demo. This version uses a split pane to allow resizing between the frozen columns block and the scrollable columns block. It sort of feels like a hack.

import java.awt.BorderLayout;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;

/**
 * SplitPaneNonScrollingColumnsDemo
 * 
 * Creates a table system that has some columns that do not participate in
 * scrolling. In effect these columns are "frozen" and do not move.This version
 * uses a split pane to allow resizing between the frozen columns block and the
 * scrollable columns block. It sort of feels like a hack.
 * 
 * @author Collin Fagan
 */
public class SplitPaneNonScrollingColumnsDemo extends JPanel {

   private static final long serialVersionUID = 1L;

   private JTable table = new JTable();
   private JTable nonScrollingColumns = new JTable();

   /**
    * sample data column names
    */
   private static final String sportColumn = "Sport";
   private String[] columnNames = { "First Name", "Last Name", sportColumn,
         "# 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 },
         { "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 },
         { "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 } };

   /**
    * 
    */
   public SplitPaneNonScrollingColumnsDemo() {
      DefaultTableModel model = new DefaultTableModel(data, columnNames);
      table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
      table.setModel(model);
      // if not on 1.6 comment this out
      table.setFillsViewportHeight(true);

      nonScrollingColumns.setAutoCreateColumnsFromModel(false);
      nonScrollingColumns.setModel(model);
      nonScrollingColumns.setSelectionModel(table.getSelectionModel());
      nonScrollingColumns.setFillsViewportHeight(true);

      JTableHeader nonScrollingHeader = nonScrollingColumns.getTableHeader();
      nonScrollingHeader.setResizingAllowed(false);
      nonScrollingHeader.setReorderingAllowed(false);

      TableColumn firstColumn = table.getColumn("First Name");
      table.removeColumn(firstColumn);

      TableColumn secondColumn = table.getColumn("Last Name");
      table.removeColumn(secondColumn);

      nonScrollingColumns.addColumn(firstColumn);
      nonScrollingColumns.addColumn(secondColumn);

      nonScrollingColumns
            .setPreferredScrollableViewportSize(nonScrollingColumns
                  .getPreferredSize());

      setLayout(new BorderLayout());

      JScrollPane scrollingColumnsScrollPane = new JScrollPane(table);

      JScrollPane frozenColumnsScrollPane = new JScrollPane(
            nonScrollingColumns);

      JScrollBar commonScrollBar = new JScrollBar();

      scrollingColumnsScrollPane
            .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

      frozenColumnsScrollPane
            .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

      frozenColumnsScrollPane.setHorizontalScrollBar(new JEmptyScrollBar(
            JEmptyScrollBar.HORIZONTAL));

      frozenColumnsScrollPane.setVerticalScrollBar(commonScrollBar);
      scrollingColumnsScrollPane.setVerticalScrollBar(commonScrollBar);

      JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
            frozenColumnsScrollPane, scrollingColumnsScrollPane);

      split.setDividerSize(4);
      split.setDividerLocation(nonScrollingColumns.getPreferredSize().width);

      add(split, BorderLayout.CENTER);
   }

   /**
    * Empty scrollbar implementation. For use on the frozen side.
    */
   private class JEmptyScrollBar extends JScrollBar {
      public JEmptyScrollBar(int direction) {
         super(direction);
         removeAll();
      }

      @Override
      public void paint(Graphics g) {
      }
   }

   /**
    * 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 SplitPaneNonScrollingColumnsDemo());
            demoFrame.setSize(300, 200);
            demoFrame.setVisible(true);
         }
      });
   }
}

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

Revision r2 - 24 May 2008 - 11:47:22 - Main.aberrant
Parents: WebHome > Javatutorials