¿Cómo asigno Enter como la tecla de activación de todos los JButtons en mi aplicación Java?

StackOverflow https://stackoverflow.com/questions/440209

  •  22-07-2019
  •  | 
  •  

Pregunta

Estoy escribiendo una aplicación Java Swing usando el aspecto Metal. Cada vez que hay un JButton en mi aplicación, el usuario usa la tecla Tab para mover el foco al botón y luego presiona la tecla Enter. ¡No pasa nada! Si presiona la tecla Espacio, se disparan los eventos del botón. ¿Cómo asigno la tecla Intro para activar los mismos eventos que la tecla Espacio? Gracias por tu ayuda.

¿Fue útil?

Solución

Encontré lo siguiente:

http://tips4java.wordpress.com/2008 / 10/25 / enter-key-and-button /

Donde Rob Camick escribe que cuando usas JDK5 y luego simplemente agregas ...

UIManager.put("Button.defaultButtonFollowsFocus", Boolean.TRUE);

... a la aplicación para resolver el problema. ¡Esto me sirvió! Y no puedo imaginar nada más simple. Sin embargo, cuando use versiones anteriores de Java, tendrá que hacer algo como Richard y Peter describen en sus respuestas a esta pregunta.

Otros consejos

Aquí hay un ejemplo completo. Richard estaba cerca, pero también debe asignar presionar ENTER a la acción, no solo liberar. Para que funcione para TODOS los botones, coloqué esta asignación en el mapa de entrada predeterminado para los botones. Agregue importaciones, y debería ser ejecutable.


public class Main implements Runnable {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Main());
    }

    @Override
    public void run() {
        setupEnterActionForAllButtons();

        JFrame frame = new JFrame("Button test");
        frame.getContentPane().add(createButton(), BorderLayout.NORTH);
        frame.getContentPane().add(createButton(), BorderLayout.SOUTH);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setVisible(true);
    }

    private void setupEnterActionForAllButtons() {
        InputMap im = (InputMap) UIManager.getDefaults().get("Button.focusInputMap");
        Object pressedAction = im.get(KeyStroke.getKeyStroke("pressed SPACE"));
        Object releasedAction = im.get(KeyStroke.getKeyStroke("released SPACE"));

        im.put(KeyStroke.getKeyStroke("pressed ENTER"), pressedAction);
        im.put(KeyStroke.getKeyStroke("released ENTER"), releasedAction);
    }

    private JButton createButton() {
        JButton b = new JButton("press enter");
        b.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Pressed");
            }
        });

        return b;
    }
}

En realidad, este es un problema de apariencia. Depende (y debe ser) la apariencia de qué tecla activa el botón enfocado.

El " botón predeterminado " la solución funciona porque la L & amp; F que está utilizando usa enter para el botón predeterminado.

La solución alternativa de Peter cambia explícitamente la acción de enfoque predeterminada de L & amp; F " clave, que es algo más convincente si me preguntas.

Agregaría que no creo que muchos usuarios quieran presionar el botón y luego presione enter (la mayoría ni siquiera notará el indicador de enfoque): quieren que la acción predeterminada sea la "correcta". uno y trabajar donde sea que presionen enter. Esto solo se puede hacer con mapas de entrada como sugiere Richard.

Sin duda, sugiero obtener una imagen muy clara de lo que sus usuarios realmente quieren y esperan (preferiblemente con referencia a otras aplicaciones que usan) antes de cambiar cualquier cosa a nivel mundial.

Lo haces asignando un mapa de entrada / acción para la tecla Intro. Algo así como lo siguiente:

// save the command mapping for space
Object spaceMap = button.getInputMap.get(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0, true));
// add a mapping from enter to the same command.
button.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true),spaceMap); 

También puede configurar el " botón predeterminado " al botón enfocado más recientemente.

Hice esto en una aplicación, y todos los métodos para hacerlo son una pesadilla para mantener y depurar. El hecho es que esto claramente no es lo que los diseñadores de Swing pretendían que sucediera.

Extensión a las respuestas anteriores para hacer lo mismo con la radio, casillas de verificación. Llamé esto antes de crear componentes

void setupEnterAction(String componentName){
    String keyName = componentName + ".focusInputMap";
    InputMap im = (InputMap) UIManager.getDefaults().get(keyName);
    Object pressedAction = im.get(KeyStroke.getKeyStroke("pressed SPACE"));
    Object releasedAction = im.get(KeyStroke.getKeyStroke("released SPACE"));
    im.put(KeyStroke.getKeyStroke("pressed ENTER"), pressedAction);
    im.put(KeyStroke.getKeyStroke("released ENTER"), releasedAction);
}

public void setEnterEvent(){
    setupEnterAction("Button");
    setupEnterAction("RadioButton");
    setupEnterAction("CheckBox");
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top