【问题标题】:Key Bindings as Alternative to KeyEvent still nonfunctional作为 KeyEvent 的替代方案的键绑定仍然不起作用
【发布时间】:2013-09-23 07:05:15
【问题描述】:

在尝试过 KeyEvents 之后,建议我切换到 Key Bindings 以通过在 TextArea 中按下箭头键来激活某些事件

                        area.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                    .put(KeyStroke.getKeyStroke("VK_UP"), 
                            "doEnterAction");
                    area.getActionMap().put("doEnterAction", new AbstractAction(){
                        @Override
                        public void actionPerformed(ActionEvent e){
                            System.out.println("Event Handled");
                            oneRay[pick][0] = ("");
                             if(i>=4){
                                 i=0;
                                 area.setText("");
                             }
                            caller();
                        }
                    });

                    area.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                    .put(KeyStroke.getKeyStroke("VK_DOWN"), 
                            "doEnterAction");
                    area.getActionMap().put("doEnterAction", new AbstractAction(){
                        @Override
                        public void actionPerformed(ActionEvent e){
                            System.out.println("Event 2 Handled");
                            area.append("\n"+oneRay[pick][1]);
                             buton1.setEnabled(true);
                             buton2.setEnabled(true);
                        }
                    });

                    area.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                    .put(KeyStroke.getKeyStroke("VK_RIGHT"), 
                            "doEnterAction");
                    area.getActionMap().put("doEnterAction", new AbstractAction(){
                        @Override
                        public void actionPerformed(ActionEvent e){
                             if(i>=4){
                                 i=0;
                                 area.setText("");
                             }
                             caller();
                        }

这段代码涵盖了三种不同的键绑定,但没有一个有效,无论我是否按下左上右,光标都会在 TextArea 中朝那个方向移动。 这次我做错了什么。请帮帮我!

【问题讨论】:

    标签: java swing binding key-bindings


    【解决方案1】:

    我是否按下左上右光标只是在 TextArea 中朝那个方向移动。

    您正在错误地构建 KeyStroke。您不应该在按键中包含“VK_”。所以基本上没有任何东西被添加到 InputMap 中。

    此外,您的代码正在使用新标识符更新 InputMap 和 ActionMap。我发现只替换 ActionMap 中的 Action 更容易。请参阅Key Bindings 以获取所有默认操作的列表以及replacing 默认操作的基本代码(这与您上次发布的链接不同)。

    最后,在您的其他帖子中,您建议您要调用按钮的操作。那么您的代码应该创建一个可供按钮和键绑定使用的操作。您创建 Action 的方式与创建 ActionListener 的方式相同,只是您扩展 AbstractAction 而不是实现 ActionListener。

    【讨论】:

    • 谢谢!我从来没有考虑过有必要替换现有的功能,我期待一些魔法 - 再次感谢。 (不过我可能很快会有另一个问题......)
    • @WilliamBrun,对不起,我原来的评论是错误的,你的基本代码是正确的,问题是你没有正确构建 KeyStroke,所以原来的 Action 仍在被调用。但是,您的原始代码也尝试更新 InputMap 和 ActionMap,而您实际上只需要使用新 Action 更新 ActionMap。当我建议您需要替换 Action 时,这就是我的意思。您不需要对 InputMap 进行任何更改,除非您正在为 InputMap 中不存在的 KeyStroke 添加和 Action。
    • 嘿!那太棒了。我按照你发给我的消息来源跳过了一些东西,现在程序可以工作了,我对可以跳过的内容的假设现在得到了你的验证。谢谢。
    猜你喜欢
    • 2018-04-26
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多