1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
import java.awt.*;
import java.awt.event.*;
import java.awt.color.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.util.*;
public class TestSortableTableModel extends JPanel
implements ActionListener {
DefaultTableModel myModel;
SortableTableModel mySortableModel;
JButton sort1, sort2, sort3, bonus;
static Object[] headers = {
"Letter", "Number", "Color"
};
static Object[][] data = {
{"A", new Integer(2), Color.gray.darker().darker()},
{"B", new Integer (3), Color.gray},
{"C", new Integer (1), Color.gray.darker()},
};
static Object[] bonusData = {
// "D", "0", Color.red // this is the (buggy) book version
"D", new Integer(0), Color.red
};
public TestSortableTableModel (DefaultTableModel m) {
super (new BorderLayout());
myModel = m;
mySortableModel = new SortableTableModel (myModel);
mySortableModel.setComparatorForColumn (new MyColorComparator(), 2);
JTable table = new JTable (mySortableModel);
table.setDefaultRenderer (java.awt.Color.class, new ColorRenderer());
JScrollPane scroller =
new JScrollPane (table,
ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
table.setPreferredScrollableViewportSize (new Dimension (400, 200));
setLayout(new BorderLayout());
add (scroller, BorderLayout.CENTER);
// add sort buttons
JPanel buttonPanel = new JPanel();
sort1 = new JButton ("Sort 1");
buttonPanel.add(sort1);
sort1.addActionListener(this);
sort2 = new JButton ("Sort 2");
buttonPanel.add(sort2);
sort2.addActionListener(this);
sort3 = new JButton ("Sort 3");
buttonPanel.add(sort3);
sort3.addActionListener(this);
bonus = new JButton ("More data");
buttonPanel.add(bonus);
bonus.addActionListener(this);
add (buttonPanel, BorderLayout.SOUTH);
}
public void actionPerformed (ActionEvent e) {
if (e.getSource() == sort1) {
mySortableModel.setSortColumn (0);
} else if (e.getSource() == sort2) {
mySortableModel.setSortColumn (1);
} else if (e.getSource() == sort3) {
mySortableModel.setSortColumn (2);
} else if (e.getSource() == bonus) {
myModel.addRow (bonusData);
}
}
public static void main (String[] args) {
DefaultTableModel aModel =
new DefaultTableModel(data, headers) ;
JFrame frame = new JFrame ("Sortable Table");
frame.getContentPane().add (new TestSortableTableModel(aModel),
BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
class MyColorComparator implements Comparator {
float[] hsb = new float[3];
public int compare (Object o1, Object o2) {
if ((! (o1 instanceof Color)) ||
(! (o2 instanceof Color)))
return 0;
else {
Color c1 = (Color) o1;
Color c2 = (Color) o2;
Color.RGBtoHSB ( c1.getRed(),
c1.getGreen(),
c1.getBlue(),
hsb);
float bright1 = hsb[2];
Color.RGBtoHSB ( c2.getRed(),
c2.getGreen(),
c2.getBlue(),
hsb);
float bright2 = hsb[2];
if (bright1 == bright2)
return 0;
else
return ((bright1-bright2) < 0) ? -1 : 1;
}
}
public boolean equals (Object obj) {
return super.equals (obj);
}
}
class ColorRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent (JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int col) {
Component returnMe =
super.getTableCellRendererComponent (table, value,
isSelected,
hasFocus, row, col);
// background only version
if (value instanceof Color) {
Color color = (Color) value;
returnMe.setBackground (color);
if (returnMe instanceof JLabel) {
JLabel jl = (JLabel) returnMe;
jl.setOpaque(true);
jl.setText ("");
}
}
return returnMe;
}
}
} |
Partager