Même si le demandeur a satisfait button.doClick()
, je cherchais quelque chose comme ce qui se passe après la définition d'une mnémonique, c'est à dire avec button.setMnemonic(KeyEvent.VK_A)
. Vous pouvez réellement maintenez les touches ALT + UN sans que rien ne se passe (à l'exception du changement de visuel). Et lors de la libération de la clé (avec ou sans la touche ALT), le bouton déclenche un ActionEvent.
J'ai trouvé que je peux obtenir de la ButtonModel (voir Java 8 API) avec button.getModel()
, alors visuellement appuyez sur le bouton avec model.setPressed(true); model.setArmed(true);
(les deux sont modifiés par des mnémoniques), et visuellement relâchez le bouton en définissant à la fois à l' false
. Et lorsqu' model.setPressed(false)
est appelée lorsque le bouton est à la fois pressé et armés, le bouton déclenche un ActionEvent automatiquement (en appelant model.setArmed(false)
seulement des changements sur le bouton visuellement).
[Citation de ButtonModel Java documentation de l'API]
Un bouton est déclenchée, et un ActionEvent est déclenché, lorsque la souris est relâché alors que le modèle est armé [...]
Pour faire la demande de réagir aux pressions sur les touches lorsque le bouton est visible (sans le contenant de la fenêtre ou sur le bouton de devoir être le centre d'intérêt du propriétaire, c'est à dire quand un autre composant dans la fenêtre est centrée), j'ai utilisé les raccourcis clavier (voir l' Officiel de Java Tutoriel).
Code de travail: Appuyez sur MAJ + A pour déficients appuyez sur le bouton (contrairement à la touche ALT avec la clé après le mnémonique est configuré avec l' button.setMnemonic()
). Et relâchez la touche pour imprimer la commande d'action ("bouton") sur la console.
// 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);
}
}
}
}