pesar de que el autor de la pregunta estaba satisfecho con button.doClick()
, Estaba buscando algo así como lo que sucede después de configurar un mnemónico, es decir, con button.setMnemonic(KeyEvent.VK_A)
. Puedes mantener presionado ALT + A sin que suceda nada (excepto el cambio visual). Y al soltar la tecla A (con o sin ALT), el botón dispara un ActionEvent.
He descubierto que puedo conseguir el ButtonModel (ver Java 8 API) con button.getModel()
, a continuación, pulse el botón visualmente con model.setPressed(true); model.setArmed(true);
(ambos se intercambien por mnemotécnicos), y suelte el botón visualmente mediante el establecimiento tanto a false
. Y cuando se llama al model.setPressed(false)
mientras el botón está presionado y armado, el botón dispara un ActionEvent automáticamente (llamando al model.setArmed(false)
solo cambia el botón visualmente).
[Presupuesto de ButtonModel Java documentación de la API] Un botón se activa, y un ActionEvent se dispara, cuando se suelta el ratón mientras que el modelo está armado [...]
Para hacer que la la aplicación reacciona a la pulsación de teclas cuando el botón está visible (sin la ventana que lo contiene o el botón que necesita ser el propietario del foco, es decir, cuando se enfoca otro componente de la ventana) Utilicé enlaces de teclas (consulte Official Java Tutorial).
Código de trabajo: Presione MAYÚS + A para apretar visualmente el botón (a diferencia de presionar ALT con la tecla después de que el mnemónico se establece con button.setMnemonic()
). Y suelte la tecla para imprimir el comando de acción ("botón") en la consola.
// 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);
}
}
}
}
posible duplicado de (http: // stackoverflow. com/questions/4753004/how-do-i-programtically-send-actionevent-to-jbutton) – OscarRyz