Code
class CheckBoxesPanel extends JPanel {
protected final String[] title = {"r", "w", "x"};
public JCheckBox[] buttons;
public CheckBoxesPanel() {
super();
setOpaque(false);
setBackground(new Color(0,0,0,0));
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
initButtons();
}
protected void initButtons() {
buttons = new JCheckBox[title.length];
for(int i=0; i < buttons.length; i++) {
JCheckBox b = new JCheckBox(title[i]);
b.setOpaque(false);
b.setFocusable(false);
b.setRolloverEnabled(false);
b.setBackground(new Color(0,0,0,0));
buttons[i] = b;
add(b);
add(Box.createHorizontalStrut(5));
}
}
protected void updateButtons(Object v) {
if("Windows 7".equals(OSNAME)) { //Windows aero?
removeAll();
initButtons();
}
Integer i = (Integer)(v==null?0:v);
buttons[0].setSelected((i&(1<<2))!=0);
buttons[1].setSelected((i&(1<<1))!=0);
buttons[2].setSelected((i&(1<<0))!=0);
}
}
class CheckBoxesRenderer extends CheckBoxesPanel
implements TableCellRenderer, Serializable {
public CheckBoxesRenderer() {
super();
setName("Table.cellRenderer");
}
@Override public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row, int column) {
updateButtons(value);
return this;
}
public static class UIResource extends CheckBoxesRenderer
implements UIResource{}
}
class CheckBoxesEditor extends CheckBoxesPanel
implements TableCellEditor, Serializable {
public CheckBoxesEditor() {
ActionListener al = new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
fireEditingStopped();
}
};
ActionMap am = getActionMap();
for(int i=0; i < buttons.length; i++) {
final JCheckBox b = buttons[i];
b.addActionListener(al);
am.put(title[i], new AbstractAction(title[i]) {
public void actionPerformed(ActionEvent e) {
b.setSelected(!b.isSelected());
fireEditingStopped();
}
});
}
InputMap im = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_R, 0), title[0]);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0), title[1]);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_X, 0), title[2]);
}
@Override public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
updateButtons(value);
return this;
}
@Override public Object getCellEditorValue() {
int i = 0;
if(buttons[0].isSelected()) i|=1<<2;
if(buttons[1].isSelected()) i|=1<<1;
if(buttons[2].isSelected()) i|=1<<0;
return i;
}
//Copid from AbstractCellEditor
protected EventListenerList listenerList = new EventListenerList();
transient protected ChangeEvent changeEvent = null;
//......
References