Baum-Struktur in Swing erzeugen wie in Eclipse-Menü

snoopysalive

Mitglied
Hallo!

Ich hab hier grad 'n Problemchen, zu dem ich nicht gleich eine Lösung gefunden habe. Ich muss eine GUI programmieren, in der der User - wie immer - eine Menge Zeug eingeben können muss. Irgendwann stößt man mit seinen JTextFields und dergleichen natürlich an die Grenzen seiner GUI und braucht Scrollbalken.

Gut, das ist ja kein Problem, dafür gibt's schließlich die JScrollPane. Allerdings erscheint es mir sinnvoll, den Benutzer nicht sofort mit allen möglichen Eingabefeldern zu überfordern, sondern diese zu kategorisieren und ähnlich wie in einem JTree die einzelnen Eingabefeldpanels in Klappmenüs unterzuordnen.

Um sich ein Bild davon machen zu können, was ich gerne hätte, schlage ich vor, dass ihr euch das folgende Eclipse-Menü anseht: Window->Preferences->Java->Compiler->Errors/Warnings.

Wie man sehen kann, sind im Eingabepanel die Eingabefelder wie in einer Baumstruktur geschachtelt. Jeder Knoten hat eine Überschrift wie "Code style" oder "Unnecessary code" und diese wiederum beinhalten eine Sammlung von Labels und Comboboxen, die vom User bearbeitet werden können. Genau das würde ich gerne implementieren.

Nur beißt es da gerade bei mir aus. Der JTree scheint sich dafür (auf den ersten Blick) nicht zu eignen. Da kann man anscheinend nur JLabels als Knoten und Blätter verwenden. Oder verstehe ich da was falsch? Lässt sich am Ende das beschriebene GUI-Design nur mit dem SWT erzeugen?

Wäre über jede Antwort dankbar.

Danke und Gruß,
Matthias
 
Ein JTree ist kein Wunder - sondern nur eine Klasse, die dazu da ist einen Baum darzustellen, mit allem was ein Baum so können muss.

Und genau da kommst du ins Spiel - Swing hindert dich nicht, auf den Baum oder die Knoten deines Baumes Listener zu setzen, die dann deine Anzeigefläche beeinflussen.

Davon abgesehen kannst du so ziemlich alles in einem JTree als Knoten verwenden, wenn du das richtige Interface implementierst (dessen Name ist mir gerade entfallen) oder du zum Beispiel einfach von DefaultMutableTreeNode ableitest. Da kannst du dann im Grunde mit verwalten was du möchtest - für den Tree stellt er sich als Knoten dar, und wie du auf Aktionen in deinem Knoten reagierst, ist wiederum dem Baum egal.
 
Danke schon mal für den Hinweis. Allerdings wurschtle ich jetzt schon wieder eine Zeitlang mit diesen TreeNodes herum und habe es noch immer nicht hingebracht, ein funktionierendes JTextField gerendert und als Editor zu bekommen. Ist halt doch nicht so einfach, zumal sich die Java-API ziemlich darüber ausschweigt bzw. es mir nicht verständlich machen kann.
 
Ein Textfeld direkt als Treenode darzustellen, ist auch etwas schwerer.

Wenn du die erwähnten Klassen implementierst, dann wird die Treenode so benannt, was die toString-Methode deiner Klasse zurückgibt.

Es müsste für den Tree einen ListSelectionListener geben, über den du den gewählten Eintrag rausfinden kannst. Bei diesem node kannst du dann eine deiner eigenen Methoden aufrufen, die die Inhalte entsprechend auf einer Fläche anzeigt.
 
Ich bekomm's nicht gebacken! Könnte mir vielleicht jemand, der sich damit auskennt, einen Codeschnipsel oder dergleichen zur Verfügung stellen? Hier nochmal die Anforderungen:

JTree soll als Eingabemaske dienen. Wie im Eclipse-Menü Window -> Preferences -> Java -> Compiler -> Errors/Warnings. Die Maske muss dabei stets unterschiedliche Eingabe-Komponenten anzeigen. Ein Beispielformular sieht so aus:

Code:
+ JLabel
+-- JLabel: JTextField
+-- JLabel: JSpinner 
+-- JLabel: JLabel
+ JLabel
+-- JLabel: JLabel
+ JLabel
+-- JLabel: JTextField
+-- JLabel: JTextField
usw.

Wichtig ist, dass (bis auf die JLabels) alles editierbar sein muss, man aber auch die Editierbarkeit in Abhängigkeit des Kontextes ändern kann. Im Endeffekt will ich ja nur erreichen, dass ich ein Standard-Eingabeformular bestehend aus Eingabekomponenten (JTextField etc.) und den zugehörigen Beschreibungen (JLabel) nach zusammengehörenden Blöcken sortieren kann und sich die Blöcke aus- und einblenden lassen. Die entsprechende Eingabemaske kann sehr lang werden, weshalb mir eine solche Lösung sehr gut gefallen würde.

Ich muss Swing verwenden. Nur um vorzubeugen, dass jemand sagt, ich solle SWT verwenden.

Im Anhang befindet sich ein Screenshot des Eclipse-Menüs für all diejenigen, die Eclipse nicht benutzen, mir aber evtl. helfen könnten/wollen. Mich interessiert der rot eingerahmte Bereich.

Gruß und Dank,
Matthias
 

Anhänge

  • eclipse.JPG
    eclipse.JPG
    75,3 KB · Aufrufe: 132
Zurück