PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Vorhandene Componenten einer Anwendung auflisten?



Matflasch
07-01-2005, 08:29
Hallo,

ich will eine Anwendung schreiben die folgendes können soll:

Wenn eine Anwendung existiert, soll ein ToolBarButton eingebaut werden mit einem JDialog. Dieser Dialog soll dann alle verwendeten Componenten der eigentlichen Anwendung in einer JList (später JTree) anzeigen.
Es sollen aber nicht Jnur Buttons,JTextFields, Jlabels sondern auch selbst erstelle Objecte angezeigt werden.

Ist sowas möglich?
ein getComponents hilft mir auch nicht weiter. Die Methode macht nicht wirklich das, was ich mir vorgestellt hatte.

Es muss doch eigentlich relativ simpel sein, alle Componenten/Objecte etc von der Anwendung aufzulisten, oder?

Die Daten sollten am besten ausgelesen werden anhand von 'this' oder this.Class (durch übergabe an den JDialog).

Ich habe hier ne Anwendung mit 5JLabel, 5JTextFields auf einem JPanel, 10Buttons auf einer JToolBar, einem Menü und 2 Tabellen. Wenn ich hier nur die getComponents() anwende, dann ist das nur JRootPane oder so gewesen und getComponentCount() gibt 1 zurück.

Wahrscheinlich ist es total leicht, aber mir fehlt der Ansatz... :/

Hat jemand nen Tipp, wie ich sowas realisieren kann?

Danke schonmal!

Mfg, Matflasch

herzberg
07-01-2005, 11:08
Du musst fuer jede Komponente, die in einem Component Objekt steckt die Methode getComponents aufrufen.

Der Grund dafuer ist der Baumartige Aufbau der Frames. Jedes Component Objekt kann wieder weitere Component Objekte aufnehmen und diese auch.

Eine Ausnahme gibt es: Du solltest bei einem JFrame nicht getComponent vom JFrame Objekt aufrufen, sondern von enthaltenen ContentPane.

JFrame.getContentPane().getComponents();

Ich hoffe das war das was du suchst.

Matflasch
09-01-2005, 15:30
Danke!

Das ist eigentlich genau das, was ich gesucht habe. Habe die Componenten nun mit
'if instanceof Container'
abgefragt, dann komme ich zum gezielten ergebnis, dass ich alle Objekte bekomme.

Allerdings habe ich noch keinen guten Weg gefunden, diese nun geordnet in einen JTree zu packen.

Hat jemand ne Idee, wie man das dann schön strukturiert in einem JTree abbilden kann?

Sonst muss ich morgen nochmal schauen, wie ich das am besten hinbekommen kann...

Mfg, Matflasch

Lin728
09-01-2005, 21:06
Nun, den Root kennst du ja schon - das JFrame.#

Danach kannst du einfach absteigen und if(instanceof JPanel) -> neue Zweige anfangen.
Ein Problem dass du hast ist, dass da Swing auf AWT ufbaut die Ableitungshirachie etwas kaput ist und z.B. jedes JComponent ein AWT-Container ist - was meiner Meinung nach etwas unlogisch ist.

Du könntest auch anhand der Childs entscheiden, ob du eine neue Node eröffnest, ist glaub ich sogar besser - dann hast du genau da eine Treenode wo eine hingehört.

Matflasch
10-01-2005, 10:32
Hi,

wie ich es vom Prinzip machen kann, weiss ich eigentlich wohl, ich habe nur das Problem, dass ich den Code nicht wirklich umgesetzt bekomme.

Abfragen mit
if JPanel
etc, wollte ich eigentlich nicht, da sehr viele Objekte selbst geschrieben sind und geschrieben werden, das sollte eigentlich alles selbst erkannt werden...

Ich poste mal die Methode, die ich bisher benutze, die aber noch nicht ganz funktioniert...


public void jlm_GetComponents(Component p_Component) {

// BO_TreeObject zum Eintragen
BO_TreeObject t_objBO_TreeObject = new BO_TreeObject();
// Wert setzen
t_objBO_TreeObject.setStrValue(p_Component.getClas s().toString() + " | (" + p_Component.getName() + ")");
// Object speichern
t_objBO_TreeObject.setObjObjekt(p_Component);
// DefaultMutableTreeNode erstellen mit dem BO_TreeObject
DefaultMutableTreeNode t_objDefaultMutableTreeNode = new DefaultMutableTreeNode(t_objBO_TreeObject);
// Das DefaultMutableTreeNode dem Root-Node hinzufügen
objDefaultMutableTreeNodeParent.add(t_objDefaultMu tableTreeNode);

// Cast als Container
// Problem ist, dass jede Componente auch gleichzeitig ein
// Container ist. Daher kann aber ohne Abfrage mittels
// 'instanceof' einfach gecastet werden.
Container t_container = (Container) p_Component;
// Falls der Container noch weitere Componenten beinhaltet
if(t_container.getComponentCount() > 0) {
// Wenn noch weitere Componenten beinhaltet sind,
// werden diese untergeordnet und somit
// wird die aktuelle Node als Haupt-Node gesetzt
objDefaultMutableTreeNodeParent = t_objDefaultMutableTreeNode;
objDefaultMutableTreeNodeNext = objDefaultMutableTreeNodeParent;
// Tiefe: X-Richtung
intCountArrayX++;
} else {
objDefaultMutableTreeNodeNext = objDefaultMutableTreeNodeParent.getPreviousNode();
// Tiefe: Y-Richtung
intCountArrayY++;
}

for (int i = 0; i < t_container.getComponentCount(); i++) {
jlm_GetComponents(t_container.getComponent(i));
}

}

Vom Prinzip her:
Ich übergeben aus irgendeiner Anwendung dem JDialog(mit dem JTree) this oder this.getRootPane() oder was auch immer man möchte und der JDialog gibt einem dann die Components aus.

Diese Methode ruft sich rekursiv immer wieder auf.
Leider habe ich noch das Problem, dass das nicht so richtig angeordnet wird.
JMenuBar und JContentPane sind z.B. nicht auf einer höhe, das JContentPane kommt leider erst eine Stufe tiefer als die JMenuBar und desto weiter es verschachtelt ist, desto schlechter stellt mein JTree es dar.

Es muss doch eine simple möglichkeit geben, wie man die Components richtig einordnet kann... :/

Ist wohl noch zu früh für mich (seit längerem *g*)

Mfg, Matflasch

Matflasch
17-01-2005, 14:29
Hab den Tree nun zusammen.

das Problem war, dass einige Components ja mehrfach vorkommen (ScrollPane, etc) und daher wurde es oft falsch zugeordnet. Etwas eindeutiges habe ich bei den Components nicht gefunden, daher habe ich zum logischen strukturieren einfach ...

klassenname + X-Position + Y-Position + HEIGHT + WIDTH

zusammengefasst. Somit war es eindeutig genug, dass alle Components richtig angeordnet sind...