如何设置Java默认按钮,以在输入键u释放时作出反应?

如何设置Java默认按钮,以在输入键u释放时作出反应?,java,swing,event-handling,defaultbutton,Java,Swing,Event Handling,Defaultbutton,在我的应用程序中,我使用默认按钮。我希望它在松开ENTER键时做出反应。当按下ENTER键时不会出现这种情况 我从按钮的InputMap中删除了击键。但这对我不起作用。我该怎么做 这是示例代码 InputMap im = button.getInputMap(); im.put(KeyStroke.getKeyStroke("ENTER"), "pressed"); im.put(KeyStroke.getKeyStroke("released ENTER"), "re

在我的应用程序中,我使用默认按钮。我希望它在松开
ENTER
键时做出反应。当按下
ENTER
键时不会出现这种情况

我从按钮的
InputMap
中删除了
击键。但这对我不起作用。我该怎么做


这是示例代码

    InputMap im = button.getInputMap();
    im.put(KeyStroke.getKeyStroke("ENTER"), "pressed");
    im.put(KeyStroke.getKeyStroke("released ENTER"), "released");
这样做的效果是,当释放ENTER时,按钮只执行其actionPerformed一次(如果我理解正确,这就是您想要的)

编辑:运行以下代码表明,仅在ENTER release时执行ActionExecuted(尽管在ENTER press时按钮看起来已经按下)


您可以使用的版本允许您将
onkeyrease
设置为
true
,如下所示


编辑:您可以停止重复,如下图所示。

默认按钮(即,无论哪个组件是focusOwner,在enter时触发的按钮)的键绑定在根窗格的componentInputMap中,这是它在聚焦窗口中的类型的inputMap。所以从技术上讲,这是一个需要调整的地方:

JComponent content = new JPanel();
content.add(new JTextField("some focusable"));
content.add(new JTextField("something else"));

JXFrame frame = wrapInFrame(content, "default button on released");
Action action = new AbstractAction("do something") {

    @Override
    public void actionPerformed(ActionEvent e) {
        LOG.info("clicked");
    }
};
JButton button = new JButton(action);
content.add(button);
frame.getRootPane().setDefaultButton(button);
// remove the binding for pressed
frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
    .put(KeyStroke.getKeyStroke("ENTER"), "none");
// retarget the binding for released
frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
    .put(KeyStroke.getKeyStroke("released ENTER"), "press");

注意:这仍然不同于非默认按钮的按下/释放行为,因为rootPane操作只需调用的button.doClick,而无需通过启用/按下buttonModel来间接触发操作。

发布部分代码。。。我很容易得到你的解决方案…按键释放和按键按下之间有什么区别,因为这个JButton必须从键盘接收一次ENTER-KeyEvent,你的意思是重复发射相同的动作直到ENTER???,在我的应用程序对话框将显示后,我按下输入文本文件触发“搜索”按钮。如果我长时间按住ENTER键,显示的对话框将自动关闭。因为它有默认按钮。是否要防止来自
输入
(在您的情况下)的多播事件???来自
ENTER
键的操作只应触发一次???,新操作只应在按下下一个键时触发???在Swing操作中使用内置布尔值检查此链接,如代码所示@kleopatra@mKorbel谢谢我添加了一个指向该答案的链接。我希望默认按钮仅在按下回车键时做出反应。它不应该对按键做出反应。你说的“反应”是什么意思?我添加了一个完整的运行示例,在这个示例中,您可以看到仅在ENTER release时执行ActionExecuted(尽管从视觉上看,按钮在ENTER press时已被按下),“React”表示触发按钮。默认按钮应仅在输入释放时触发。按下Enter键时不应发生任何事情。在您的示例中,默认按钮触发按下Enter键。。。。我按住Enter键检查了一段时间,然后它继续打印系统输出。按住Enter键不会为我打印任何系统输出,只有在我释放。。。不幸的是,我不知道为什么它对你不起作用。你的代码在工作时给了我NPE-
JRootPane rootPane=SwingUtilities.getRootPane(/*你的JFrame*/)
@raghasood33
SwingUtilities.getRootPane(yourJButton)
只有在调用了类似于
yourJFrame.add(yourJButton)
的内容后,才能在没有NPE的情况下工作。在将按钮添加到框架(或已添加到框架的容器)之前,按钮显然没有根窗格。这对我不起作用。我没有使用NPE(NullPointerException),但按钮没有焦点或任何东西。更新:我在.revalidate()和.repaint()之前调用了
rootPane.setDefaultButton(btn)
方法。这就是问题所在。现在可以了。
JRootPane rootPane = SwingUtilities.getRootPane(/* Your JButton  */); 
rootPane.setDefaultButton(/* Your JButton  */);
JComponent content = new JPanel();
content.add(new JTextField("some focusable"));
content.add(new JTextField("something else"));

JXFrame frame = wrapInFrame(content, "default button on released");
Action action = new AbstractAction("do something") {

    @Override
    public void actionPerformed(ActionEvent e) {
        LOG.info("clicked");
    }
};
JButton button = new JButton(action);
content.add(button);
frame.getRootPane().setDefaultButton(button);
// remove the binding for pressed
frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
    .put(KeyStroke.getKeyStroke("ENTER"), "none");
// retarget the binding for released
frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
    .put(KeyStroke.getKeyStroke("released ENTER"), "press");
JRootPane rootPane = SwingUtilities.getRootPane(/* Your JButton  */); 
rootPane.setDefaultButton(/* Your JButton  */);