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