Anzeige:
Ergebnis 1 bis 6 von 6

Thema: Vorhandene Componenten einer Anwendung auflisten?

  1. #1
    Registrierter Benutzer
    Registriert seit
    03.04.2002
    Beiträge
    112

    Vorhandene Componenten einer Anwendung auflisten?

    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
    Verteilt die Macht, dass sie keinen mächtig macht!

  2. #2
    Registrierter Benutzer
    Registriert seit
    12.11.2004
    Ort
    Berlin
    Beiträge
    32
    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.

  3. #3
    Registrierter Benutzer
    Registriert seit
    03.04.2002
    Beiträge
    112
    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
    Verteilt die Macht, dass sie keinen mächtig macht!

  4. #4
    Registrierter Benutzer
    Registriert seit
    16.09.2001
    Beiträge
    1.182

    Naja...

    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.
    Geändert von Lin728 (20-08-2017 um 19:33 Uhr)

  5. #5
    Registrierter Benutzer
    Registriert seit
    03.04.2002
    Beiträge
    112
    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...

    Code:
        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.getClass().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_objDefaultMutableTreeNode);
    
            // 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
    Verteilt die Macht, dass sie keinen mächtig macht!

  6. #6
    Registrierter Benutzer
    Registriert seit
    03.04.2002
    Beiträge
    112
    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...
    Verteilt die Macht, dass sie keinen mächtig macht!

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •