我在写使用金属的外观和感觉一个Java Swing应用程序。有一个JButton在我的应用程序的用户每次使用Tab键将焦点移动到按钮,然后点击回车键。什么都没发生!如果他打空格键按钮事件被触发。如何分配回车键触发事件作为空格键?感谢您的帮助。

有帮助吗?

解决方案

我发现如下:

http://tips4java.wordpress.com/2008 / 10/25 /输入键和按钮/

在哪里罗布Camick写道,使用JDK5时,以后你只需添加...

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

...到要解决的问题中的应用。这奏效了我!我不能想象还有什么简单。但是,使用旧版本的Java时,你将不得不做一些像理查德和彼得在他们的答案说明了这个问题。

其他提示

下面是完整的示例。理查德接近,但你也需要映射压制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;
    }
}

其实,这是一个外观和感觉的问题。它是(并且应该是)到的外表和感觉哪个键触发焦点的按钮。

“默认按钮”变通运作的,因为L&F你使用用途的默认按钮进入。

Peter的解决办法明确改变了L&F默认的“重点行动”的关键 - 如果你问我这是有点更有说服力

我要补充一点,我不认为很多用户会希望标签的按钮,然后按下回车键(大部分甚至不会注意到的重点指标) - 他们想要的默认操作是“正确”的一个工作无论他们按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); 

您还可以设置“默认按钮”最近集中的按钮。

我这样做是对的应用程序,这样做的所有方法都是维护和调试的噩梦。事实是,这显然不是什么摇摆的设计者预期的情况发生。

扩展至上述答案做相同无线电,复选框。 创建组件之前调用此

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");
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top