Komponenten einer Anwendung in JTree strukturiert auflisten?

Status
Nicht offen für weitere Antworten.

Matflasch

Aktives Mitglied
Hallo,

ich möchte eine Anwendung schreiben, in der alle Komponenten eines JFrame oder JDialog aufgelistet werden.

Also bei einer z.B. vorhandenen Anwendung soll ein zusätzlicher Button eingebaut werden. Beim klick wird ein JDialog aufgerufen und dem wird dann die Komponente/Klasse übergeben, von dem der JDialog die Komponenten auflisten soll. Ist es möglich in dem JDialog dann alle Komponenten des JFrame oder JDialog aufzulisten und strukturiert in einem JTree auszugeben?

Ein list() gibt mir in der Console die Komponenten soweit aus, bis auf die JMenuBar. Allerdings liefert list() nichts zurueck, somit kann ich die Daten auch nicht weiter verarbeiten.

Ein getComponents() vom ContentPane aus liefert mir die ToolBar und mein HauptPanel, nicht aber die JMenuBar.
Nun hatte ich mir erhofft, dass ich von der ToolBar die Buttons auslesen kann durch ein weiteres getComponents(), allerdings klappt das an dieser stelle nicht. Somit bekomme ich nicht alle, sonder nur die von der Anordnung her, ersten Komponenten.

Ist es überhaupt möglich die Komponenten komplett aufzulisten?
Am besten wäre es noch, wenn eigens erstellte Objekt auch mti angezeigt werden würden (also nicht grafische Objekte).

Kann mir da jemand nen Tipp geben, wie man sowas anfangen kann?

Danke schonmal!

Mfg, Matflasch
 
Die Componenten sind ein bisschen verschachtelt (z.B. ist die JMenuBar nicht teil des Content, sondern des RootPanes), hier hilft Rekursion weiter:

Code:
public void components( Component component ){
  // irgendwas mit der Component machen
  System.out.println( component );

  if( component instanceof Container ){
    Container container = (Container)component;
    for( int i = 0; n = container.getComponentCount(); i<n; i++ )
      components( container.getComponent( i ));
  }
}

Und sowas kann man ganz gut in einem JTree umsetzen, schau dir das Interface "TreeModel" an, solche Dinge "getChildCount" sind einfach zu schreiben (ähnelt erstaunlich "getComponentCount" :wink: )
 
Danke!

Das klappt soweit schonmal perfekt!

Allerdings scheine ich zu blöd zu sein, das ganze in einen JTree geordnet unterzubringen 😳

Kann mir jemand sagen, wie ich die geordnet im JTree unterbringen kann? Also so, wie sie auch im Java an sich angeordnet sind...?

Danke!

Ich brauch hilfe!!! *g*

Mfg, Matflasch
 
Hallo nochmal...

Ich habe nun einen JTree zustande bekommen.
Ich habe es folgendermaßen gemacht:

- RootNode gesetzt anhand der Root-Klasse.
- Jeweils auf Unter-Components geprüft. Falls welche vorhanden sind das ganze rekursiv aufgerufen.
- Vor dem rekursiven Aufruf habe ich aber dann den gesamten JTree durchsucht nach der 'getParent()'-Klasse der aktuellen Component. Somit wusste ich ja den übergeordneten Container, in dem die aktuelle Component liegt. Daher konnte ich es zu der Node einfach hinzufügen. Allerdings würde das ganze nichtmehr klappen, wenn ich z.B. Klassen wie 'javax.swing.JScrollPane$ScrollBar' oder 'javax.swing.JViewPort' ausblenden will.
Wenn es flexibel sein soll, kann ich die Struktur hier vergessen.
Eine andere Möglichkeit fällt mir aber nicht ein. In einem 2-dimensionalem Array kann ich das ganze ja auch nicht wirklich strukturieren, wenn ich bestimmte Klassen nicht anzeigen will.
- Im moment bildet der JTree auch ausschliesslich die Klassennamen ab. Ich möchte aber gern in Klammern dahinter den Namen der Component. Wenn ich den Namen allerdings dahinterpacke, dann ist die gesamte Struktur falsch.
Der Quelltext ist, meiner Meinung nach, viel zu komplex und unnötig Aufwendig geworden, allerdings find ich keine andere Lösung.

Besteht interesse am Quelltext? Weil wahrscheinlich gibt es eine ganz simple Methode um das ganze fertigzustellen, daher bräuchte ich das Board nicht mit meinem QuellCode zuzumüllen...

TIA, Matflasch
 
Was meinst du mit "ausblenden"?

Du kannst den Containern einen ContainerListener hinzufuegen. Der wird immer benachrichtigt, wenn z.B. eine Component entfernt wird. Wenn diese geschieht, musst du nur den JTree von der veraenderten Struktur unterrichten.
Das machst du ueber das TreeModel, dem TreeModel (das Interface musst du noch implementieren) werden TreeModelListener uebergeben, wenn sich die Struktur(=Model) aendert, muss man nur diese Listener aufrufen, der Rest erledigt sich automatisch.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben