Code
JList
class CheckBoxCellRenderer extends JCheckBox
implements ListCellRenderer, MouseListener, MouseMotionListener {
@Override public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
this.setOpaque(true);
if(isSelected) {
this.setBackground(list.getSelectionBackground());
this.setForeground(list.getSelectionForeground());
}else{
this.setBackground(list.getBackground());
this.setForeground(list.getForeground());
}
if(value instanceof CheckBoxNode) {
this.setSelected(((CheckBoxNode)value).selected);
this.getModel().setRollover(index==rollOverRowIndex);
}
this.setText(value.toString());
return this;
}
private int rollOverRowIndex = -1;
@Override public void mouseExited(MouseEvent e) {
JList l = (JList)e.getSource();
if(rollOverRowIndex>=0) {
l.repaint(l.getCellBounds(rollOverRowIndex, rollOverRowIndex));
rollOverRowIndex = -1;
}
}
@SuppressWarnings("unchecked")
@Override public void mouseClicked(MouseEvent e) {
if(e.getButton()==MouseEvent.BUTTON1) {
JList l = (JList)e.getComponent();
DefaultListModel m = (DefaultListModel)l.getModel();
Point p = e.getPoint();
int index = l.locationToIndex(p);
if(index>=0) {
CheckBoxNode n = (CheckBoxNode)m.get(index);
m.set(index, new CheckBoxNode(n.text, !n.selected));
l.repaint(l.getCellBounds(index, index));
}
}
}
@Override public void mouseMoved(MouseEvent e) {
JList l = (JList)e.getSource();
int index = l.locationToIndex(e.getPoint());
if(index != rollOverRowIndex) {
rollOverRowIndex = index;
l.repaint();
}
}
@Override public void mouseEntered(MouseEvent e) {}
@Override public void mousePressed(MouseEvent e) {}
@Override public void mouseReleased(MouseEvent e) {}
@Override public void mouseDragged(MouseEvent e) {}
}
JTree
class CheckBoxNodeRenderer extends JCheckBox implements TreeCellRenderer {
private TreeCellRenderer renderer = new DefaultTreeCellRenderer();
@Override public Component getTreeCellRendererComponent(
JTree tree, Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
if(leaf && value != null && value instanceof DefaultMutableTreeNode) {
this.setOpaque(false);
Object userObject = ((DefaultMutableTreeNode)value).getUserObject();
if(userObject!=null && userObject instanceof CheckBoxNode) {
CheckBoxNode node = (CheckBoxNode)userObject;
this.setText(node.text);
this.setSelected(node.selected);
}
return this;
}
return renderer.getTreeCellRendererComponent(
tree, value, selected, expanded, leaf, row, hasFocus);
}
}
class CheckBoxNodeEditor extends JCheckBox implements TreeCellEditor {
private final JTree tree;
public CheckBoxNodeEditor(JTree tree) {
super();
this.tree = tree;
setOpaque(false);
setFocusable(false);
addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
stopCellEditing();
}
});
}
@Override public Component getTreeCellEditorComponent(
JTree tree, Object value, boolean isSelected, boolean expanded,
boolean leaf, int row) {
if(leaf && value != null && value instanceof DefaultMutableTreeNode) {
Object userObject = ((DefaultMutableTreeNode)value).getUserObject();
if(userObject!=null && userObject instanceof CheckBoxNode) {
this.setSelected(((CheckBoxNode)userObject).selected);
} else {
this.setSelected(false);
}
this.setText(value.toString());
}
return this;
}
@Override public Object getCellEditorValue() {
return new CheckBoxNode(getText(), isSelected());
}
@Override public boolean isCellEditable(EventObject e) {
return (e != null && e instanceof MouseEvent);
}
//Copid from AbstractCellEditor
//protected EventListenerList listenerList = new EventListenerList();
//transient protected ChangeEvent changeEvent = null;
@Override public boolean shouldSelectCell(java.util.EventObject anEvent) {
//...
References