Java Swing键绑定

5

这是在 JPanel 的构造函数中,但是当我按下 "h" 键时并没有打印任何内容。如果需要更多的代码,请告诉我。谢谢!

String hide = "hide";
    this.getInputMap().put(KeyStroke.getKeyStroke('h'), hide);
    this.getActionMap().put(hide, new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent e) {
                System.out.println("HIDDEN");
            if (isHidden){
                slide.setVisible(true);
            }else{
                slide.setVisible(false);
            }
        }
    });

1
顺便提一下,你只能使用 slide.setVisible(isHidden);,如果我没记错的话,你可以使用 getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) 或者当祖先。 - nachokk
我不确定我理解了。 slide.setVisible(true/false) 在我看来工作得相当好。 - Yesha
你可以使用一行代码来替代if/else语句,实现相同的功能。 - camickr
啊,我明白你的意思了。我怎么在没有if/else的情况下告诉布尔值切换到它的相反值呢? - Yesha
要切换状态,您可以使用:slide.setVisible( ! slide.isVisible() ); - camickr
1个回答

8
this.getInputMap()....

您正在尝试将绑定添加到默认InputMap中,该InputMap是组件具有焦点时的InputMap。默认情况下,JPanel没有焦点。
您应该尝试使用其他InputMaps,可以使用getInputMap(int)方法。或者您需要使面板可聚焦并让其获得焦点。
阅读Swing教程中关于如何使用按键绑定的更多信息,以获取有关指定所需InputMap的正确变量的信息。

谢谢!WHEN_IN_FOCUSED_WINDOW 运行得很好。有没有什么可以替换它的东西,以便即使窗口没有焦点也能工作?我的应用程序设置为始终置顶,因此它始终可见但不一定在焦点中。谢谢! - Yesha
Swing只有在获得焦点时才会响应事件。 - camickr
据我所知,应用程序接管您的屏幕并不好。 - camickr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接