001package jmri.util.swing; 002 003import java.awt.Component; 004 005import javax.swing.*; 006import javax.swing.tree.DefaultMutableTreeNode; 007import javax.swing.tree.TreeCellRenderer; 008import javax.swing.tree.TreePath; 009 010/** 011 * JCheckBoxTreeCellRenderer implements a TreeCellRenderer for JCheckBoxTree 012 * @author Steve Young Copyright (C) 2025 013 */ 014public class JCheckBoxTreeCellRenderer implements TreeCellRenderer { 015 016 private final TriStateJCheckBox checkBox; 017 018 final JPanel panel; 019 020 public JCheckBoxTreeCellRenderer() { 021 super(); 022 panel = new JPanel(); 023 panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); 024 // panel.setLayout(new BorderLayout()); 025 checkBox = new TriStateJCheckBox(); 026 // panel.add(checkBox); 027 panel.setOpaque(false); 028 } 029 030 @Override 031 public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, 032 boolean expanded, boolean leaf, int row, boolean hasFocus) { 033 034 panel.removeAll(); 035 panel.add(checkBox); 036 037 DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; 038 if (!(tree instanceof JCheckBoxTree)) { 039 return panel; 040 } 041 JCheckBoxTree jcbt = (JCheckBoxTree) tree; 042 TreePath tp = new TreePath(node.getPath()); 043 if (jcbt.isSelectedPartially(tp)) { 044 checkBox.setState(TriStateJCheckBox.State.PARTIAL); 045 } else { 046 checkBox.setSelected(jcbt.isSelected(tp)); 047 } 048 Object obj = node.getUserObject(); 049 checkBox.setText(obj == null ? null : obj.toString()); 050 JPanel withExtras = getPanelExtras(node); 051 if ( withExtras != null ) { 052 panel.add( withExtras); 053 } 054 return panel; 055 } 056 057 public JPanel getPanelExtras(DefaultMutableTreeNode value) { 058 return null; 059 } 060 061}