2009-08-03 18 views
12

Devo aggiungere caselle di controllo a un JTree. Un TreeCellRenderer/TreeCellEditor personalizzato sembra l'approccio giusto. Finora ho usato the CheckBoxNodeRenderer approach in this webpage. Funziona OK tranne che per due cose:JTree con caselle di controllo

  1. ci sono spazi bianchi aggiuntivi sopra + sotto la casella di controllo; Mi piacerebbe tenerlo come un normale JTree.
  2. Vorrei distinguere tra fare clic sulla casella di controllo stessa (che dovrebbe tentare di attivare la casella di controllo) e fare clic sul testo associato alla casella di controllo (che dovrebbe consentire a un listener di eventi di interpretarlo facendo clic sul nodo dell'albero corrispondente e prendere qualsiasi azione sia appropriata)

c'è un modo per fare queste cose? Ho cercato JTrees con le checkbox, non ho trovato molto. JIDE sembra buono, ma ho bisogno di usare software open source gratuito (GPL non è ok, LGPL è ok) in questo caso. (o crea il mio albero di caselle di controllo)

risposta

7

Per quanto riguarda il n. 2, puoi creare un pannello come editor/renderer e aggiungere un'etichetta insieme alla casella di controllo: l'etichetta sarebbe il testo e la casella di controllo non avere il testo aggiunto.

+0

oh, questa è una buona idea, non ci avevo pensato. –

+1

Ricorda che se copi solo il codice DefaultTreeCellRenderer e sostituisci l'estensione di JLabel con un JPanel, dovrai anche rimuovere molti metodi "sovrascritti per le prestazioni" o avrai un JTree vuoto. –

4

per @aperkins suggerimento questo è quello che ho finito per fare in TableCellRenderer, sembra funzionare bene:

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); 

Le chiavi per sbarazzarsi di spazio indesiderate a margine sembra essere (a) chiamando JCheckBox.setMargin() per ridurre il margine della casella di controllo e (b) utilizzando un BorderLayout per JPanel.

9

So che questo problema è stato già risposto, ma voglio solo chiarire alcuni punti:

1) Strato JIDE comune è doppia licenza (GPL con l'eccezione classpath e la licenza commerciale gratuito). Ciò significa che è possibile utilizzare Common Layer Project senza problemi di licenza. Si prega di controllare il seguente link per confermare: http://www.jidesoft.com/products/oss.htm. Il Common Layer include un'implementazione di un JTree controllabile (com.jidesoft.swing.CheckBoxTree).

2) C'è un blog datato 2005 dallo stesso Maestro, Santhosh Kumar, in cui spiega come implementare un JTree con caselle di controllo con i requisiti che hai menzionato: http://www.jroller.com/santhosh/entry/jtree_with_checkboxes. Vale la pena leggerlo, secondo me.

+0

+1 per il suggerimento della licenza –

+1

JIDE Common Layer interrompe tutti gli schemi di collector perché installa la propria interfaccia utente, non trova come risolvere, se qualcuno sa come condividerla. – Bax

2

Ho rilasciato un progetto standalone Swing Checkbox Tree, disponibile da Maven Central come org.scijava:swing-checkbox-tree.

Il pacchetto è basato sul codice CheckBox Node Tree Sample di John Zukowski. È concesso in licenza BSD-2 senza dipendenze.

Permette combinare liberamente DefaultMutableTreeNode e CheckBoxNodeData tipi di nodi. Permette anche di controllare i nodi della casella come nodi non foglia.

Riguardo al problema n. 1 della domanda: non ho eseguito test su tutte le piattaforme, ma sui miei sistemi OS X, i nodi CheckBoxNodeData hanno esattamente la stessa altezza in pixel dei nodi DefaultMutableTreeNode.

Per quanto riguarda la della domanda numero 2: utilizza un JCheckBox + JLabel in un JPanel (come aperkins suggerisce) di distinguere tra cliccando su una casella di controllo (per selezionare/deselezionare un nodo) rispetto un'etichetta (per selezionare un nodo) .

utilizzi Esempio:

Quest'ultimo esempio ha anche il codice per commutare in modo ricorsivo sottoalberi in risposta alle scatole essendo selezionata o deselezionata (vedere la treeNodesChanged metodo).

Problemi correlati