JmenuItems an 2 Stellen verwenden

RealHAZZARD

Erfahrenes Mitglied
Hallo,

ich habe folgende Situation:

Ich habe eine JMenuBar als Hauptmenü. Des Weiteren habe ich ein PopUpMenü, das bei Rechtsklick (auf eine andere Komponente) erscheinen soll. Ich habe das ganze so gestrickt, dass das PopupMenü ohne Probleme an die MenuItems von meiner Klasse MainMenu (JMenuBar und die Verwaltung der Menüs und Items) ran kommt. Die Item erscheinen auch grundsätzlich, aber nun zu

meinem Problem:
je nach dem, welchem Menu (popup oder mainMenu) ich die Items als letztes hinzugefügt habe, das hat die Items auch, aber das andere menu hat sie dann nicht mehr.

Kann ich es irgendwie schaffen, dass die Items pro menu und zur selben Zeit vorhanden sind?

Danke.
 
Vielleicht wäre es eine Überlegung wert, eine Art MenuItem Factory zu schreiben. Diese baut dir dann die Objekte, an welche dann dieselben Actions gehängt werden - zu Actions siehe die Links, die flashray gepostet hat.
 
Danke für die schnellen Antworten. Das mit den Actions habe ich noch nicht gemacht, aber ich schaue mir die Links morgen an. Sachde dass das son nicht geht. Mein Problem waren nicht die Actions, sondern das Handling wann welche Items sichtbar sind. Na mal sehen, vielleicht schreibe ich mir soetwas wie einen Manager dafür, der zwar unterschiedliche Items ausspuckt, aber ein und die selbe Logik hinter die jeweilig zusammengehörenden Items stehen lässt.
 
Hm, wenn es Dir darum geht, dass gewisse Items gar nicht angezeigt werden, musst Du es wohl selbst schreiben. Actions jedoch können disabled werden, und alle Components, die daran hängen, werden dadurch auch disabled.

z.B. (Pseudocode)

Action "OpenWindowAction"

menuItem1.setAction( openWindowAction )
menuItem2.setAction( openWindowAction )

openWindowAction.setEnabled( false )....

führt dazu, dass menuItem1 und menuItem2 auch disabled werden, d.h. nur noch grau und nicht anklickbar sind.
 
Hallo,

danke nochmal für deinen Hinweis. Ich wollte jetzt versuchen, die Action so zu überschreiben, dass ich das selbe mit dem Attribut Visible erreichen kann, wie es die Action schon mit Enabled macht. Mein Problem ich komme irgendwie nicht an die Komponenten ran, die diese Action gesetzt haben. Das es aber gehen muss, sieht man ja an dem setenabled(). Denn da wird ja dann wie durch Zauberei alle Komponenten das Enabledattribut gesetzt.
Ich hoffe ihr könnt meinen wirren Ausschweifung noch folgen. :)
 
Ja, ich kann Deinen Ausführungen folgen :)

Ich weiß nicht genau, wie es gemacht wird. Ich vermute aber, es läuft anders herum ab: nicht die Action setzt das Component auf disabled, sondern das Component schaut bei jedem Repaint nach, ob die Action noch aktiviert ist.

Ein Blick in den Java Source könnte helfen, habe aber gerade keine Zeit dazu...
 
Ich habe es jetzt so gemacht:

Es gibt eine Factory (danke@DarthShader). An der lasse ich alle im Programm vorkommenden Actions registrieren. Diese sind über einen String (weil ich es über eine HashTable mache) jederzeit zu erreichen. Des Weiteren gibt es in der Factory eine Methode getJMenuItem(String key) und eine getJButton(String key). Über den key kann ich die action wieder zuweisen und bekomme einen neuen Button / MenuItem mit der action.
Und mein spezielles Problem habe ich so gelöst:
Ich überschreibe jeden Button / MenuItem so:
Java:
public JButton getJButton(String key){
        Action a = actions.get(key);
        if (a!=null) return new JButton(a){
            public void repaint() {
                Action a = getAction();
                if (a!=null){
                    setVisible(a.isEnabled());
                }
                super.repaint();
            }
        };
        else return null;
    }
 
Na da sieht doch ganz gut aus. Du hast meine "Vermutung" ja quasi umgesetzt, dass sich der Button am Zustand seiner Action orientiert. Hast Du da nochmal nachgeschaut, ist es in Java Swing auch so implementiert, oder hast Du es einfach so programmiert?
 
Ja ich habe mich an deinem Vorschlag orientiert. Aber nein ich hab nicht extra nachgeschaut. Nachdem du mir das geschrieben hast, war es mir auch logisch und so wie ich Swing kenne ist das bestimmt so wie du geschrieben hast.
Danke nochmal
 
Zurück