2016-10-20 6 views
2

Ich habe versucht, eine Nummer für jede Zeile in meinem Baum hinzuzufügen. Der Baum und seine Nummerierung funktioniert, aber nicht so gut. Gibt es andere Möglichkeiten, dies zu implementieren? Denn wenn der Baumknoten erweitert wird, muss ich den ganzen erweiterten Baumknoten bekommen und seine Nummerierung erhöhen. Ich habe auch den TreeViewer verwendet, um den Baum zu erstellen.So erstellen Sie einen JFace TreeViewer mit Zeilennummerierung

enter image description here

// base container 
Composite composite = new Composite((Composite) parent, SWT.NONE); 
composite.setLayout(new GridLayout(2, false)); 
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 

// The container for numbering in the tree 
Composite numComposite = new Composite(composite, SWT.NONE); 
numComposite.setLayout(new FillLayout(SWT.VERTICAL)); 
numComposite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING)); 

// the tree container 
MyTree tree = new MyTree(composite); 
tree.setContentProvider(new ContentProvider()); 

Label test = new Label(numComposite, SWT.NONE); 
test.setText("1"); 
test = new Label(numComposite, SWT.NONE); 
test.setText("2"); 
test = new Label(numComposite, SWT.NONE); 
test.setText("3"); 
test = new Label(numComposite, SWT.NONE); 
test.setText("4"); 
test = new Label(numComposite, SWT.NONE); 
test.setText("5"); 
+0

Die Verwendung separater Beschriftungen führt zu Ausrichtungsproblemen, da nicht garantiert werden kann, dass die Höhe der Baumreihen mit den Höhen/Abständen der Beschriftungen übereinstimmt - und die Anzahl der Plattformen variiert.Selbst in Ihrem Bild verrutscht die Ausrichtung bereits. Ich kann mir keinen guten Weg vorstellen, dies zu tun. –

+0

Mit 'MyTree' möchte ich daran erinnern, dass [SWT-Steuerelemente nicht unterklassifiziert sein sollen] (http://stackoverflow.com/questions/4264983/why-is-subclassing-not-allowed-for-many-of) -die-swt-Kontrollen). –

+0

Das [Nebula Grid] (http://www.eclipse.org/nebula/widgets/grid/grid.php) könnte einen Blick wert sein. Es funktioniert mit der Reihennummerierung, aber vielleicht nicht so, wie Sie es gerne hätten. Es nummeriert Elemente basierend auf ihrer Position des vollständig expandierten Baums anstatt nur die sichtbaren Elemente von 1 bis n zu nummerieren. – Baz

Antwort

4

schlage ich mit einer benutzerdefinierten Canvas Steuerung zu starten, die die gleiche Höhe wie die Tree widget hat.

Immer wenn die vertikale Bildlaufposition des Baums geändert wird, muss Canvas neu gezeichnet werden (canvas.redraw()). Um solche Änderungen zu verfolgen, müssen mehrere Zuhörer hinzugefügt werden

  • eine Auswahl Hörer (tree.getVerticalBar().addSelectionListener()) auf der Bildlaufleiste
  • ein Schlüssel Hörer (tree.addKeyListener()), der die Leinwand aktualisiert, wenn Navigationstasten wie Up/unten, PgUp/PgDn usw. gedrückt werden
  • ein resize-Hörer (tree.addControlListener()), die die Größe und den Inhalt des Canvas aktualisiert, wenn der Baum
  • ... wahrscheinlich einige ...

Die Farbe Hörer des benutzerdefinierten Canvas ist verkleinert könnte die Zeilennummern ziehen. Die erste Zeilennummer könnte aus dem oberen Index (tree.getTopIndex()) abgeleitet werden. Nachfolgende Zeilennummern würden die Elementhöhe des Baums (tree.getItemHeight()) verwenden, um sich mit den Zeilen auszurichten.


habe ich hier einen Entwurf der oben skizzierte Lösung hochgeladen:

https://gist.github.com/rherrmann/fc248fb01a00fb4fa73187cbbdaf441f

A main Methode ist enthalten, dass die Anwendung Zeilennummer Lineal mit einer kleinen SWT demonstriert.

Die bevorzugte Breite wird derzeit von der Breite der Zeichenfolge "9999" in der aktuellen Schriftart abgeleitet. Da jedoch die maximale Zeilennummer immer mit getVisibleItemCount() berechnet werden kann, sollte es nicht schwierig sein, die bevorzugte Breite einzustellen, um genügend Platz für die aktuell angezeigten Zeilennummern zu schaffen.

Der schwierigste Teil wird wahrscheinlich sein, zu bestimmen, wann das Eltern von Tree und TreeRule nach der Änderung der bevorzugten Breite neu zu verteilen.

Es kann hier und da kleine Fehler geben, die behoben werden müssen, aber insgesamt zeigt der Code die Machbarkeit dieses Ansatzes.

Der Code in getVisibleItemCount() wird von einem kopiert und dann angepasst.

+1

+1 Sehr schönes Beispiel. Hoffentlich gibt es eine gute Möglichkeit, die Breite des Lineals basierend auf der Anzahl der sichtbaren Elemente in der Struktur zu messen. – Baz

Verwandte Themen