2009-08-03 12 views
12

Ich muss Kontrollkästchen zu einem JTree hinzufügen. Ein benutzerdefinierter TreeCellRenderer/TreeCellEditor scheint der richtige Ansatz zu sein. Bisher habe ich the CheckBoxNodeRenderer approach in this webpage verwendet. Es funktioniert OK bis auf zwei Dinge:JTree mit Kontrollkästchen

  1. gibt es zusätzliche Leerzeichen über + unter dem Kontrollkästchen; Ich möchte es wie einen normalen JTree behalten.
  2. Ich möchte unterscheiden zwischen dem Klicken auf das Kontrollkästchen selbst (das sollte versuchen, das Kontrollkästchen zu aktivieren) und Klicken auf den Text mit dem Kontrollkästchen verknüpft (was sollte ein Ereignis Listener dies als Klicken auf den entsprechenden Baum Knoten und zu interpretieren) was auch immer zweckdienlich ist)

Gibt es eine Möglichkeit, diese Dinge zu tun? Ich sah mich nach JTrees mit Checkboxen um, konnte nicht viel finden. JIDE sieht gut aus, aber ich brauche in diesem Fall freie Open-Source-Software (GPL ist nicht ok, LGPL ist in Ordnung). (oder erstellen Sie meine eigene Checkbox-Struktur)

Antwort

7

Wie # 2, könnten Sie ein Panel der Editor/Renderer, und fügen Sie eine Beschriftung zusammen mit dem Kontrollkästchen - die Beschriftung wäre der Text, und das Kontrollkästchen würde nicht habe den Text hinzugefügt.

+0

oh, das ist eine gute Idee, daran hatte ich nicht gedacht. –

+1

Wenn Sie nur den DefaultTreeCellRenderer-Code kopieren und die Erweiterung von JLabel durch eine JPanel ersetzen, müssen Sie auch viele der Methoden "overridden for performance" entfernen oder Sie haben einen leeren JTree. –

4

pro @aperkins Vorschlag dies ist, was ich in dem Table am Ende tun, es scheint gut zu funktionieren:

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

Die Schlüssel für am Rande des unerwünschten Raumes loszuwerden scheint (a) Aufruf zu sein JCheckBox.setMargin(), um den Checkbox-Rand zu reduzieren, und (b) ein BorderLayout für JPanel.

9

Ich weiß, diese Frage bereits beantwortet wurde, aber ich möchte nur einige Punkte klären:

1) JIDE gemeinsame Schicht ist Dual-Lizenz (GPL mit Classpath Ausnahme und freier kommerzieller Lizenz). Dies bedeutet, dass Sie das Common-Layer-Projekt ohne Lizenzprobleme verwenden können. Bitte überprüfen Sie den folgenden Link zur Bestätigung: http://www.jidesoft.com/products/oss.htm. Der Common Layer enthält eine Implementierung eines überprüfbaren JTree (com.jidesoft.swing.CheckBoxTree).

2) Es gibt einen Blog, der 2005 vom Meister selbst, Santhosh Kumar, datiert wurde, wo er erklärt, wie man einen JTree mit Checkboxen mit den Anforderungen, die Sie erwähnten, implementiert: http://www.jroller.com/santhosh/entry/jtree_with_checkboxes. Es lohnt sich, es zu lesen, meiner Meinung nach.

+0

+1 für den Lizenzhinweis –

+1

Jide Common Layer bröckelt alle Ihre Collor-Schema, weil es eine eigene Benutzeroberfläche installiert, nicht finden, wie zu beheben, wenn jemand weiß, wie bitte teilen Sie es. – Bax

2

Ich habe ein eigenständiges Projekt Swing Checkbox Tree veröffentlicht, das von Maven Central als org.scijava:swing-checkbox-tree erhältlich ist.

Das Paket basiert auf dem Code CheckBox Node Tree Sample von John Zukowski. Es ist BSD-2-lizenziert ohne Abhängigkeiten.

Es ermöglicht das Mischen und Anpassen von DefaultMutableTreeNode und CheckBoxNodeData Knotentypen. Es erlaubt auch Kontrollkästchen Knoten als Nicht-Blatt-Knoten.

Zum Problem der Frage # 1: Ich habe nicht auf allen Plattformen getestet, aber auf meinen OS X-Systemen sind die CheckBoxNodeData Knoten genau die gleiche Höhe in Pixel wie die DefaultMutableTreeNode Knoten.

die Frage Frage Bezüglich # 2: es wird ein JCheckBox + JLabel in einem JPanel (wie aperkins schon sagt) zwischen einem Klick auf einem Kontrollkästchen zu unterscheiden (aktivieren/deaktivieren einen Knoten) im Vergleich zu einem Etikett (wählen Sie einen Knoten) .

Beispiele für den Gebrauch:

Letzteres Beispiel hat auch Code zum rekursiven Teilbäume in Reaktion auf Boxen wird aktiviert oder deaktiviert (siehe treeNodesChanged Makeln Methode).

Verwandte Themen