2010-03-02 7 views
7

Zum Beispiel, ich habe eine Reihe von Symbolleisten-Schaltflächen am oberen Rand des Hauptfensters meiner Anwendung. Ich möchte eine Mnemonic an eine von diesen anhängen, das ist nur ein einzelner Tastendruck, wie F3.Java Swing: Kann ich einen Button Mnemonic setzen, der nicht auf alt drücken muss?

Wenn Sie die Mnemonik auf KeyEvent.VK_F3 setzen, muss der Benutzer Alt + F3 drücken.

Wenn Sie über einen Menüeintrag verfügen, können Sie anstelle von mnemonic einen Accelerator festlegen und auswählen, ob Sie einen Metaschlüssel verwenden möchten. Mit Schaltflächen können Sie jedoch kein Beschleuniger setzen.

Gibt es eine Möglichkeit, den Meta-Schlüssel für Button-Mnemotechniken zu drehen?

Antwort

4

Actions kann ein Stück Code an einen Menüeintrag, einen Tastendruck, eine Schaltfläche und alles, was Sie interessiert, binden.

Im Allgemeinen denken Sie nicht, dass Ihr Code an einen bestimmten Tastendruck/ein bestimmtes Ereignis gebunden ist - und verwenden Sie keine anonymen inneren Klassen. Verwenden Sie stattdessen echte Klassen, in denen Ihr Code für verschiedene Arten von Dingen wiederverwendet werden kann. Dieses von der Action-Klasse verwendete Muster liefert einige gute Beispiele dafür.

3

Gut hinter den Kulissen, ob Sie einen Beschleuniger oder eine Gedächtnisstütze auf einer Komponente verwenden, wird die Methode eine Key Binding für Sie erstellen.

Es gibt also nichts, was Sie daran hindert, einen KeyStroke und eine Aktion an die von Ihnen gewünschte Komponente zu binden und die Schlüsselbindung manuell zu erstellen. Es kann sogar eine Komponente sein, die nicht über die Methode setMNemonic (...) verfügt.

0

Sind Sie sicher, dass Beschleuniger nicht auf Schaltflächen definiert werden können, wenn die Schaltfläche mit einer Aktion konfiguriert wurde? (. Ich weiß, das war an einem Punkt wahr, aber ich dachte, das in späteren Versionen von Java verschieden sein können)

In jedem Fall ist hier eine andere Methode, um es auf eine Schaltfläche zu setzen:

button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(myKeyStroke, "actionName"); 
button.getActionMap().put("actionName", myAction); 

Wo myKeyStroke ein Tastenanschlag wie F3 ist, ist "actionName" eine Beschriftung (String) und myAction ist die Aktion, die es aufruft.