2009-08-03 66 views
12

Necesito agregar casillas de verificación a un JTree. Un TreeCellRenderer/TreeCellEditor personalizado parece ser el enfoque correcto. Hasta ahora he usado the CheckBoxNodeRenderer approach in this webpage. Funciona bien excepto por dos cosas:JTree con casillas de verificación

  1. hay espacios en blanco adicionales arriba + debajo de la casilla de verificación; Me gustaría mantenerlo igual que un JTree normal.
  2. 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 que un oyente de evento interprete esto haciendo clic en el nodo de árbol correspondiente y tomar la acción que sea apropiada)

¿hay alguna manera de hacer esto? 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 cree mi propio árbol de casillas de verificación)

Respuesta

7

En cuanto al n. ° 2, podría hacer que un panel sea el editor/renderer, y agregar una etiqueta junto con la casilla: la etiqueta sería el texto y la casilla de verificación no tener el texto agregado a él.

+0

oh, esa es una buena idea, no había pensado en eso. –

+1

Solo tenga en cuenta que si solo copia el código DefaultTreeCellRenderer y reemplaza la extensión de JLabel con un JPanel, también tendrá que eliminar muchos de los métodos "reemplazados por el rendimiento" o tendrá un JTree en blanco. –

4

por @aperkins sugerencia esto es lo que terminé haciendo en el TableCellRenderer, que 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 de espacio no deseado en los márgenes parece ser (a) solicitar JCheckBox.setMargin() para reducir el margen de la casilla de verificación, y (b) usar un BorderLayout para JPanel.

9

Sé que esta pregunta se ha respondido ya, pero sólo quiero aclarar algunos puntos:

1) Capa JIDE común es con licencia dual (GPL con excepción ruta de clases y la licencia comercial libre). 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 del 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.

+0

+1 para la pista de la licencia –

+1

JIDE Common Layer elimina todos los esquemas de collor porque instala su propia IU, no encontró la manera de solucionarlo, si alguien sabe cómo compartirlo. – Bax

2

He lanzado un proyecto independiente Swing Checkbox Tree, disponible en Maven Central como org.scijava:swing-checkbox-tree.

El paquete está basado en el código CheckBox Node Tree Sample de John Zukowski. Tiene licencia BSD-2 sin dependencias.

Permite mezclar y combinar DefaultMutableTreeNode y CheckBoxNodeData tipos de nodos. También permite nodos de casilla de verificación como nodos hoja.

Respecto al problema # 1: 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.

Con respecto de la cuestión edición # 2: se utiliza un JCheckBox + JLabel en un JPanel (como aperkins sugiere) para diferenciar entre al hacer clic en una casilla de verificación (a activar/desactivar un nodo) frente a una etiqueta (para seleccionar un nodo) .

Ejemplo usos:

El último ejemplo también tiene código para alternar de forma recursiva subárboles en respuesta a las cajas que se comprueba o sin marcar (ver la treeNodesChanged método).

Cuestiones relacionadas