質問者は に満足してbutton.doClick()
いましたが、ニーモニックを設定した後、つまり で何が起こるかのようなものを探していましたbutton.setMnemonic(KeyEvent.VK_A)
。実際には、何も起こらずに ALT + A を押し続けることができます (視覚的な変化を除く)。キー A (ALT の有無にかかわらず) を離すと、ボタンは ActionEvent を発生させます。
で ButtonModel ( Java 8 APIを参照) を取得しbutton.getModel()
、 でボタンを視覚的に押しmodel.setPressed(true); model.setArmed(true);
(どちらもニーモニックによって変更されます)、両方を に設定して視覚的にボタンを離すことができることがわかりましたfalse
。またmodel.setPressed(false)
、ボタンが押されてアームされている間に が呼び出されると、ボタンは ActionEvent を自動的に起動します (呼び出しmodel.setArmed(false)
はボタンを視覚的に変更するだけです)。
[ButtonModel Java API ドキュメントからの引用] モデルがアームされているときにマウスが離されると、ボタンがトリガーされ、ActionEvent が発生します [...]
ボタンが表示されているときにアプリケーションがキーの押下に反応するようにするために (つまり、ウィンドウ内の別のコンポーネントがフォーカスされている場合に、含まれているウィンドウまたはボタンがフォーカスの所有者である必要はありません)、キー バインドを使用しました (公式 Java チュートリアルを参照)。
作業コード: SHIFT + A を押してボタンを視覚的に押します (ニーモニックが で設定された後に キーで ALT を押すのとは対照的ですbutton.setMnemonic()
)。キーを放して、コンソールにアクション コマンド (「ボタン」) を出力します。
// MnemonicCode.java
import javax.swing.*;
import java.awt.event.*;
public class MnemonicCode extends JFrame
{
public MnemonicCode(int keyCode)
{
JButton button = new JButton("button");
getContentPane().add(button);
addMnemonicToButton(button,keyCode);
button.addActionListener(new ActionListener () {
public void actionPerformed(ActionEvent e)
{
System.out.println(e.getActionCommand());
}
});
pack();
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) throws Exception
{
MnemonicCode bp = new MnemonicCode(KeyEvent.VK_A);
}
void addMnemonicToButton(JButton button,int keyCode)
{
int shiftMask = InputEvent.SHIFT_DOWN_MASK;
// signature: getKeyStroke(int keyCode, int modifiers, boolean onKeyRelease)
KeyStroke keyPress = KeyStroke.getKeyStroke(keyCode,shiftMask,false);
KeyStroke keyReleaseWithShift = KeyStroke.getKeyStroke(keyCode,shiftMask,true);
// get maps for key bindings
InputMap inputMap = button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap actionMap = button.getActionMap();
// add key bindings for pressing and releasing the button
inputMap.put(keyPress,"press"+keyCode);
actionMap.put("press"+keyCode, new ButtonPress(button));
inputMap.put(keyReleaseWithShift,"releaseWithShift"+keyCode);
actionMap.put("releaseWithShift"+keyCode, new ButtonRelease(button));
///*
// add key binding for releasing SHIFT before A
// if you use more than one modifier it gets really messy
KeyStroke keyReleaseAfterShift = KeyStroke.getKeyStroke(keyCode,0,true);
inputMap.put(keyReleaseAfterShift,"releaseAfterShift"+keyCode);
actionMap.put("releaseAfterShift"+keyCode, new ButtonRelease(button));
//*/
}
class ButtonPress extends AbstractAction
{
private JButton button;
private ButtonModel model;
ButtonPress(JButton button)
{
this.button = button;
this.model = button.getModel();
}
public void actionPerformed(ActionEvent e)
{
// visually press the button
model.setPressed(true);
model.setArmed(true);
button.requestFocusInWindow();
}
}
class ButtonRelease extends AbstractAction
{
private ButtonModel model;
ButtonRelease(JButton button)
{
this.model = button.getModel();
}
public void actionPerformed(ActionEvent e)
{
if (model.isPressed()) {
// visually release the button
// setPressed(false) also makes the button fire an ActionEvent
model.setPressed(false);
model.setArmed(false);
}
}
}
}