java - JTree con casillas de verificación
swing checkbox (4)
Necesito agregar casillas de verificación a un JTree. Un TreeCellRenderer / TreeCellEditor personalizado parece ser el enfoque correcto. Hasta ahora usé el enfoque CheckBoxNodeRenderer en esta página web . Funciona bien, excepto por dos cosas:
- hay espacios en blanco adicionales arriba + debajo de la casilla de verificación; Me gustaría mantenerlo igual que un JTree normal.
- Me gustaría distinguir entre hacer clic en la casilla de verificación (que debería intentar alternar la casilla de verificación) y hacer clic en el texto asociado con la casilla de verificación (que debería permitir a un oyente de eventos interpretar esto haciendo clic en el nodo de árbol correspondiente y tomar cualquier acción es apropiado)
¿Hay alguna manera de hacer estas cosas? Busqué a JTrees con casillas de verificación, no puedo encontrar mucho. JIDE se ve bien, pero necesito usar un software libre de código abierto (GPL no está bien, LGPL está bien) en este caso. (o crea mi propio árbol de casillas de verificación)
En cuanto al # 2, podría hacer que un panel sea el editor / procesador, y agregar una etiqueta junto con la casilla de verificación: la etiqueta sería el texto y la casilla de verificación no tendría el texto agregado.
He lanzado un proyecto de Swing Checkbox Tree independiente, disponible en Maven Central como org.scijava:swing-checkbox-tree
.
El paquete está basado en el código de muestra del árbol de nodos CheckBox de John Zukowski. Tiene licencia BSD-2 sin dependencias.
Permite mezclar y combinar los tipos de nodo DefaultMutableTreeNode
y CheckBoxNodeData
. También permite nodos de casilla de verificación como nodos hoja.
Respecto al problema # 1 de la pregunta: no probé en todas las plataformas, pero en mis sistemas OS X, los nodos CheckBoxNodeData
tienen exactamente la misma altura en píxeles que los nodos DefaultMutableTreeNode
.
Respecto al problema # 2 de la pregunta: usa un JCheckBox
+ JLabel
en un JPanel
(como aperkins sugiere) para diferenciar entre hacer clic en una casilla de verificación (para marcar / desmarcar un nodo) frente a una etiqueta (para seleccionar un nodo).
Ejemplos de uso:
- Simple: CheckBoxTreeSample
- Complejo: WatchEventsFrame
El último ejemplo también tiene un código para alternar recursivamente subárboles en respuesta a las casillas que se treeNodesChanged
o no (consulte el método treeNodesChanged
).
Sé que esta pregunta ya ha sido respondida, pero solo quiero aclarar algunos puntos:
1) JIDE Common Layer tiene doble licencia (GPL con excepción classpath y licencia comercial gratuita). Esto significa que puede usar Common Layer Project sin ningún problema de licencia. Por favor, consulte el siguiente enlace para confirmar: http://www.jidesoft.com/products/oss.htm . Common Layer incluye una implementación de un JTree seleccionable (com.jidesoft.swing.CheckBoxTree).
2) Hay un blog que data de 2005 del propio Master, Santhosh Kumar, donde explica cómo implementar un JTree con casillas con los requisitos que mencionas: http://www.jroller.com/santhosh/entry/jtree_with_checkboxes . Vale la pena leerlo, en mi opinión.
por sugerencia de @aperkins esto es lo que terminé haciendo en el TableCellRenderer, parece funcionar bien:
final private JPanel nodeRenderer = new JPanel();
final private JLabel label = new JLabel();
final private JCheckBox check = new JCheckBox();
...
// in constructor:
final Insets inset0=new Insets(0,0,0,0);
this.check.setMargin(inset0);
this.nodeRenderer.setLayout(new BorderLayout());
this.nodeRenderer.add(this.check, BorderLayout.WEST);
this.nodeRenderer.add(this.label, BorderLayout.CENTER);
Las claves para deshacerse del espacio no deseado en los márgenes parece ser (a) llamar a JCheckBox.setMargin () para reducir el margen de la casilla de verificación, y (b) usar un BorderLayout para JPanel.