Como atribuir Enter como a chave gatilho de todas JButtons em minha aplicação Java?

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

  •  22-07-2019
  •  | 
  •  

Pergunta

Eu estou escrevendo um aplicativo Java Swing usando o Metal look-and-feel. Toda vez que há um JButton no meu aplicativo o usuário usa a tecla Tab para mover o foco para o botão e, em seguida, bate a tecla Enter. Nada acontece! Se ele bate na tecla de espaço os eventos de botão são disparados. Como atribuir a chave para acionar os mesmos eventos como a tecla Espaço Enter? Obrigado por sua ajuda.

Foi útil?

Solução

Eu encontrei o seguinte:

http://tips4java.wordpress.com/2008 / 10/25 / enter-key-e-botão /

Onde Rob Camick escreve que quando se utiliza JDK5 e depois você simplesmente adicionar ...

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

... com a aplicação para resolver o problema. Isso fez o truque para mim! E eu não posso imaginar nada mais simples. No entanto, quando usando versões antigas do Java você vai ter que fazer algo como Richard e Peter descrevem em suas respostas a esta pergunta.

Outras dicas

Aqui está um exemplo completo. Richard estava perto, mas você também precisa mapear pressionado ENTER para ação, não apenas liberado. Para fazê-lo funcionar para todos os botões, pus esse mapeamento para mapa de entrada padrão para os botões. Adicionar as importações, e deve ser executável.


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;
    }
}

Na verdade, esta é uma questão look and feel. Ele é (e deve ser) até a aparência quanto ao que desencadeia-chave no botão focada.

O botão "default" solução alternativa funciona desde o L & F você estiver usando usos entrar para o botão padrão.

solução de Peter muda explicitamente a chave L & F padrão "ação foco." - que é um pouco mais convincente se você me perguntar

Gostaria de acrescentar que eu não acho que muitos usuários gostariam de guia para o botão, em seguida, tecle enter (a maioria não vai nem perceber o indicador de foco) - eles querem a ação padrão para ser o "certo" eo trabalho onde quer que pressione enter. Isso só pode ser feito com mapas de entrada como Richard sugere.

Eu certamente sugiro começar uma imagem muito clara do que seus usuários realmente querem e esperam (de preferência com referência a outros aplicativos que eles usam) antes de alterar qualquer coisa no mundo.

Você faz isso através da atribuição de um mapa de entrada / ação para a tecla Enter. Algo como o seguinte:

// 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); 

Você também pode definir o botão "default" para o botão mais recentemente focalizado.

Eu fiz isso em um aplicativo, e todos os métodos de fazer isso são um pesadelo para manter e depurar. O fato é que este é claramente não o que os designers de balanço destinado a acontecer.

Extensão de respostas acima para fazer mesmo com rádio, caixas de seleção. Chamado antes a criação de 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top