JMenuItem und Shortcuts

meckiebro

Mitglied
Hallo zusammen,
Ich bastle gerade an meinem JMenu.
Ich habe jetzt ein Problem beim Undo/Redo. Und zwar möchte ich das Undo oder Redo deaktiviert ist wenn diese Aktion nicht möglich ist.
Ich prüfe das indem ich von meinen CommandStack einfach einer der zwei Methoden aufrufe. canUndo() oder canRedo().

Das funktioniert wie folgt ganz gut
Java:
edit.addMenuListener(new MenuListener(){
			@Override
			public void menuSelected(MenuEvent e) {
				updateEditMenu();
			}

			@Override
			public void menuCanceled(MenuEvent arg0) {}

			@Override
			public void menuDeselected(MenuEvent arg0) {}
			
		});

Die Methode updateEditMenu() prüft dann wie oben beschrieben, ob undo/redo möglich und enabled oder disabled dann das entsprechende JMenuItem.
Soweit so gut.

Aber jetzt möchte ich auch noch shortcuts an den Items anbringen. das geht auch erst ganz gut. Das Problem ist nur wenn ich den shortcut drücke aber das Item nach der letzen Aktion disabled war, reagiert der listener nicht.
War das verständlich? Ansonsten kann ich nochmal weiter ausholen.
Wie handhabt ihr das immer?

Liebe Grüße
Meckie
 
Zuletzt bearbeitet:
Das Problem ist das dein MenuListener eben nur auf interaktion mit dem Menu reagiert, also vorzugsweise mit der Maus oder auch Tastatur z.B. über ALT das Menu aktivieren und dann mit Pfeiltasten navigieren so wie mit ENTER auslösen.
Dabei wird am Ende immer ein ActionEvent ausgelöst was schlussendlich den Aufruf der Methode durchführt.
Der MenuListener sitz aber nicht direkt an dem ActionEvent sondern lediglich am MenuEvent was eintritt wenn das Menu aktiviert wird.
Verwendest du jetzt Hotkeys so wird über ein KeyEvent das ActionEvent dierekt angestoßen ohne den MenuListener zu kontaktieren wesshalb dieser nichts davon mitbekommt.

Du musst also eine zentrale Stelle haben an der geprüft wird die Aktion zulässig ist und dann MenuItem soweit überschreiben das diese ausgewertet wird. Auch muss auf die selbe Methode innerhalb der Methoden zugegriffen werden um bei einem Hotkey zu prüfen ob die Aktion auch zulässig ist.
 
Das es darin liegt war mir bewusst. Dachte es gibt da eine elegante Lösung für. Da müsste es einen anderen Listener für geben der vor der Aktion,sei es Maus oder Tastatur, reagiert.
Ich gucke mal in die Klassen rein was die da so machen.

Danke aber schonmal für die schnelle Antwort
 
Hmm entwender habe ich das noch nicht richtig verstanden aber mit der Klasse Action/AbstractAction kann ich mir das alles zwar basteln um keine Redundanz bei JMenu und JToolbar zu haben. Das gleiche Problem tritt aber auch hier auf. Action reagiert auch nicht bei dem shortcut wenn das Object disabled ist.

Es wird zwar im Text irgendwas von disabled gesprochen aber wie steht da natürlich nicht. Oder ich habe es übersehen

Ich habe es jetzt bisher wie folgt gemacht: Da mein CommandStack Observable ist habe ich jetzt meiner JMenuBarView zu einen Observer gemacht und update die menuitems nach einem notify vom CommandStack. Gefällt mir immer noch nicht. Besser wäre nur das anpassen der menuitems wenn der Benutzer auch wirklich eine Aktion ausführen will.
Meiner Meinung nach ist das ein Fehler, aber vielleicht habe ich auch noch nicht die passende Lösung gefunden.

Grüße
Meckie
 
Zuletzt bearbeitet:
Das ist kein Fehler in Java oder irgendwelchen Klassen !
Du verlangst da nur etwas was du halt selbst programmieren musst weil es das so in Java selbst nicht existiert.
 
Ja gut Fehler war vielleicht ein zu hartes Wort.
Ich hab nochmal in die Klassen geschaut. Glaube ich habe die Stelle dir mir das Problem verursacht

Java:
protected boolean processKeyBinding(KeyStroke ks, KeyEvent e,
			int condition, boolean pressed) {
		InputMap map = getInputMap(condition, false);
		ActionMap am = getActionMap(false);
		
		if(map != null && am != null && isEnabled()) {
			Object binding = map.get(ks);
			Action action = (binding == null) ? null : am.get(binding);
			if (action != null) {
				return SwingUtilities.notifyAction(action, ks, e, this,
						e.getModifiers());
			}
		}
		return false;
	}

das ist auch JComponent. Ich weiß noch nicht ob das mit dem überlagen klappen wird.
edit: Hmm ist nicht das richtige.....
edit2: Ich lass das jetzt mit dem Observer... gefällt mir nicht aber das hält mich zu lange auf.
 
Zuletzt bearbeitet:
Zurück