import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreePath;
public class Main {
public static void main(String[] args) {
DefaultMutableTreeNode root = new DefaultMutableTreeNode(Boolean.TRUE);
DefaultMutableTreeNode child1 = new DefaultMutableTreeNode(Boolean.FALSE);
DefaultMutableTreeNode child2 = new DefaultMutableTreeNode(Boolean.FALSE);
root.add(child1);
root.add(child2);
DefaultTreeModel model = new DefaultTreeModel(root);
JTree tree = new JTree(model);
tree.setCellRenderer(new TreeRenderer());
tree.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
TreePath pathForLocation = tree.getPathForLocation(e.getX(), e.getY());
Object lastPathComponent = pathForLocation.getLastPathComponent();
if (lastPathComponent instanceof DefaultMutableTreeNode) {
Boolean oldObject = (Boolean) ((DefaultMutableTreeNode) lastPathComponent)
.getUserObject();
((DefaultMutableTreeNode) lastPathComponent)
.setUserObject(!oldObject);
model.nodeChanged((DefaultMutableTreeNode) lastPathComponent);
}
}
});
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(tree, BorderLayout.CENTER);
frame.setSize(800, 600);
frame.setVisible(true);
}
}
class TreeRenderer implements TreeCellRenderer {
private final JCheckBox checkbox = new JCheckBox();
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
checkbox.setSelected((Boolean) node.getUserObject());
checkbox.setText("Row:" + row);
return checkbox;
}
}