【问题标题】:KeyListener on jTextField is not workingjTextField 上的 KeyListener 不起作用
【发布时间】:2015-02-21 00:10:27
【问题描述】:

我将事件添加到我的 jTextField

jTextField1.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                jTextField1KeyTyped(evt);
            }
        });

这是我的代码的第二部分(负责处理键盘按钮):

 private void jTextField1KeyTyped(java.awt.event.KeyEvent evt) {                                     
        switch (evt.getKeyCode()) {
                case KeyEvent.VK_1:
                    print(one);
                    System.out.println("1");
                    break;
                case KeyEvent.VK_2:
                    print(two);
                    System.out.println("2");
                    break;
                case KeyEvent.VK_3:
                    print(three);
                    System.out.println("3");
                    break;
                case KeyEvent.VK_4:
                    print(four);
                    System.out.println("4");
                    break;
                case KeyEvent.VK_5:
                    print(five);
                    System.out.println("5");
                    break;
                case KeyEvent.VK_6:
                    print(six);
                    System.out.println("6");
                    break;
                case KeyEvent.VK_7:
                    print(seven);
                    System.out.println("7");
                    break;
                case KeyEvent.VK_8:
                    print(eight);
                    System.out.println("8");
                    break;
                case KeyEvent.VK_9:
                    print(nine);
                    System.out.println("9");
                    break;
                case KeyEvent.VK_0:
                    print(zero);
                    System.out.println("0");
                    break;
            }
    }                  

但它不起作用。当我按下任何按钮时 - 什么都没有发生。

【问题讨论】:

  • 尝试使用默认语句查看switch语句是否正在运行。
  • 请提供更多有关此 textField 内容以及您正在使用它的内容的上下文。特别是,它有焦点吗?
  • 您是否尝试调试您的代码并查看 evt.getKeyCode() 的实际值是多少?
  • 我强烈建议您彻底改变策略。您不应该在 JTextField 内使用 KeyListener,因为这会扰乱 JTextField 的功能。使用 DocumentListener 或 DocumentFilter 或其他更好的选项之一。由于您似乎没有限制输入,因此请使用通过 addDcoumentListener(...) 附加到 JTextField 文档的 DocumentListener。
  • 查看keycode的值是什么并打印出来。确保它正在运行。

标签: java swing keyboard jtextfield keylistener


【解决方案1】:

我强烈建议您彻底改变策略。您不应该在 JTextField 内使用 KeyListener,因为这会扰乱 JTextField 的功能。使用 DocumentListener 或 DocumentFilter 或其他更好的选项之一。由于您似乎没有限制输入,因此请使用通过 addDcoumentListener(...) 附加到 JTextField 文档的 DocumentListener。

即,

jTextField1.getDocument().addDocumentListener(new DocumentListener() {

    public void keyTyped(java.awt.event.KeyEvent evt) {

        void insertUpdate(DocumentEvent e) {
            // ... code to check document change here
        }

        void removeUpdate(DocumentEvent e){
            // ... code to check document change here
        }

        void changedUpdate(DocumentEvent e){
            // ... code to check document change here
        }

    }

});

编辑:如果您想捕捉计算器的数字按键,那么也不要使用它。而是使用键绑定。

【讨论】:

  • 好的,我会研究 DocumentListener 和 DocumentFilter 但首先我会尝试用键绑定做一些事情。
  • @MichałGwóźdź:请查看tutorial
【解决方案2】:

好吧,您应该使用 DocumentListener 或 ChangeListener 也可以选择 FocusListener 可以选择 keyListener 确实可以完成这项工作,但是如果您想避免焦点问题,请使用 KeyBindings 或者您可以尝试显式调用特定组件的grabFocus() 方法,因此当注册到组件时,keyListener 需要该组件处于焦点。

【讨论】:

  • 键绑定可能过于严格,并且出于与KeyListener 用于文本组件相同的原因,不建议使用。正如 HovercraftFullOfEels 已经建议的那样,最好的选择是DocumentListener,因为当用户键入某些内容、将某些内容粘贴到以编程方式修改的字段时,它会在文档发生更改时通知您...
  • 那么更改监听器可能会为各种更改做好足够的工作
  • 但是JTextField 没有ChangeListener 支持,DocumentListener 是最好的选择...
  • 是的,我的坏 changelistener 不兼容你的权利,但我认为键绑定可以很好地完成这项工作,但我也觉得 documentlistener 会更好,虽然它需要更多的练习跨度>
  • 键绑定需要你绑定每一个可能的组合键击......这是很多工作......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多