如何在我的Java应用程序中将Enter指定为所有JButton的触发键?

时间:2009-01-13 18:34:07

标签: java swing events jbutton

我正在使用Metal外观编写Java Swing应用程序。每次我的应用程序中都有JButton时,用户使用Tab键将焦点移动到按钮,然后按Enter键。什么都没发生!如果他按下Space键,则会触发按钮事件。如何指定Enter键以触发与Space键相同的事件?谢谢你的帮助。

6 个答案:

答案 0 :(得分:17)

我发现了以下内容:

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

Rob Camick写道,在使用JDK5时,您只需添加...

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

...给应用程序解决问题。这对我有用!我无法想象更简单的事情。但是,当使用旧版本的Java时,你必须做一些像Richard和Peter在这个问题的答案中描述的东西。

答案 1 :(得分:4)

这是完整的例子。理查德很接近,但你还需要将按下的ENTER映射到动作,而不仅仅是释放。为了使它适用于所有按钮,我已将此映射放入按钮的默认输入映射。添加导入,它应该是可以运行的。


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

答案 2 :(得分:1)

实际上,这是一个外观和感觉问题。它(并且应该)取决于哪个键触发聚焦按钮的外观和感觉。

“默认按钮”解决方法的工作原理,因为您正在使用的L& F使用输入作为默认按钮。

彼得的解决方法明确改变了L& F默认的“焦点动作”键 - 如果你问我,这个键更有说服力。

我想补充一点,我不认为很多用户会想要选中按钮然后点击输入(大多数人甚至不会注意到焦点指示符) - 他们希望默认操作是“正确的”并且工作他们按哪里进入。这只能通过理查德建议的输入地图来完成。

我肯定建议在更改任何内容之前,先了解用户实际想要和期望的内容(最好是参考他们使用的其他应用)。

答案 3 :(得分:0)

您可以通过为Enter键分配输入/操作映射来完成此操作。如下所示:

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

答案 4 :(得分:0)

您还可以将“默认按钮”设置为最近聚焦的按钮。

我在一个应用程序上做了这个,所有这样做的方法都是维护和调试的噩梦。事实上,这显然不是Swing设计师想要发生的事情。

答案 5 :(得分:0)

扩展到上面的答案,与收音机,复选框一样。 在创建组件之前调用此方法

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