【问题标题】:What is the proper use of KeyListener? [closed]KeyListener 的正确用法是什么? [关闭]
【发布时间】:2013-06-13 21:49:53
【问题描述】:

所以我一直在努力尝试在我的 jTextFields 中提取数据,并且此错误消息不断弹出,指的是:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: calcu.turkey (<--my class) cannot be cast to java.awt.event.KeyListener

      jTextField2.addKeyListener(new java.awt.event.KeyListener() {

        @Override
        public void keyTyped(KeyEvent ke) {
            //To change body of generated methods, choose Tools | Templates.
        }

        @Override
        public void keyPressed(KeyEvent ke) {
          //To change body of generated methods, choose Tools | Templates.
        }

        @Override
        public void keyReleased(KeyEvent ke) {
            //To change body of generated methods, choose Tools | Templates.
        }
    });
    jTextField2.addKeyListener((KeyListener) this);
    jTextField2.setFont(new java.awt.Font("Times New Roman", 0, 10)); // NOI18N
    jTextField2.setText("0");
    getContentPane().add(jTextField2);
    jTextField2.setBounds(250, 40, 70, 20);

最重要的是这一行:jTextField2.addKeyListener((KeyListener) this);,因为它将 (KeyListener) 视为错误。我想知道如何正确添加 KeyListener 以便它获取文本字段中的数字。

【问题讨论】:

  • 阅读 Swing 教程。教程中介绍了如何实现 Key Listener 或 Action Listener。

标签: java swing actionlistener jtextfield keylistener


【解决方案1】:

您不使用 KeyListener。您很少需要这样做。有更好的 API 可供使用。

例如,当使用文本组件时,您可能会使用DocumentListener(请参阅How to Write a Document Listener)或DocumentFilter(请参阅Implementing a Document Filter)。

我想知道如何正确添加 KeyListener 以便它获取文本字段中的数字。

通常你会在一些不相关的事件中获取号码。例如,您在表单上有一个“提交”按钮。然后在这种情况下,您将向按钮添加一个 ActionListener,然后在您要提交表单时使用文本字段的 getText() 方法。

另外,我在上面引用的 Swing 教程有一个关于 How to Write a Key Listener 的部分。

【讨论】:

  • 有没有办法让它自动刷新答案?这会带来很多问题吗?
  • @Potatoesforfish,你在说什么?你想引用什么?
  • 这些数字被提取并处理成一个方程式以产生答案。如果我按照你的方式做,每次我想计算答案时都必须按下按钮。
  • @Potatoesforfish, I would have to press the button each time I wanted to compute the answer - 你怎么知道用户何时输入完号码?如果你的方程有多个数字,你怎么知道所有数字何时都有一个有效值。这是您将使用“计算”​​按钮的情况。 If I did it your way - 如果所有字段始终都有有效信息,并且您希望每次更改单个数字时都重新计算,那么我的方法(更好的方法)是使用 DocumentListener 而不是 KeyListener。
  • 我在我的库或 Net Beans IDE 中找不到 DocumentListener... 有这个包吗?
【解决方案2】:
  1. 您收到错误是因为您的类没有实现KeyListener 接口。您需要有一个类似public class turkey implements KeyListener 的类声明,然后在您的类中实现KeyListener 接口定义的所有方法。
  2. 就此而言,正确的方法是不要将KeyListener 用于JTextField(或任何JTextComponent)。使用 DocumentListenerDocumentFilter(取决于您的用例)
  3. 不知道为什么您将匿名 KeyListener 添加到文本字段,然后还想将您的类实例添加为 KeyListener

【讨论】:

    【解决方案3】:
    jTextField2.addKeyListener((KeyListener) this);
    

    上面的行是罪魁祸首。好像你的班级没有实现KeyListener 事实上,我认为您根本不需要该行,因为您已经通过 jTextField2.addKeyListener(new ...KeyListener 附加到 jTextField2

    在以下 3 种方法中,您可以使用 ke.getKeyCode() 或 ke.getKeyChar() 来检索按下的键。

    @Override
        public void keyTyped(KeyEvent ke) {
            //To change body of generated methods, choose Tools | Templates.
        }
    
        @Override
        public void keyPressed(KeyEvent ke) {
          //To change body of generated methods, choose Tools | Templates.
        }
    
        @Override
        public void keyReleased(KeyEvent ke) {
            //To change body of generated methods, choose Tools | Templates.
        }
    

    【讨论】:

    • “我的类不是抽象的,并且没有覆盖 ActionListener 中的抽象方法 actionPreformed(ActionEvent)”现在是罪魁祸首。
    • @Potatoesforfish 这个错误信息很清楚。如果你不明白,我建议你从一本关于面向对象编程/Java基础知识的书/教程开始
    • 你的类不需要实现ActionListener。我实际上指的是 KeyListener。
    猜你喜欢
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 2016-02-27
    • 2011-12-25
    相关资源
    最近更新 更多