【问题标题】:KeyPressed event is called multiple times [closed]多次调用 KeyPressed 事件[关闭]
【发布时间】:2020-09-10 08:05:26
【问题描述】:

我有一个jTextField 并为其添加了一个关键监听器。所以,如果我输入一些内容并按下 Enter 键,keypressed 事件将被调用,然后我将保存输入的内容。

但是,如果我按下 Enter 键,它会被调用 3 次。

tPatientName.addKeyListener(new java.awt.event.KeyAdapter() {
        @Override
        public void keyPressed(java.awt.event.KeyEvent e) {
              if(e.getKeyCode() == KeyEvent.VK_ENTER) {
                  System.out.println("Saved Successfully");
              }
        }
    }); 

控制台输出:

Saved Successfully
Saved Successfully
Saved Successfully

我不知道我的代码有什么问题。 提前致谢。

【问题讨论】:

  • 它对我来说很好用。发布minimal reproducible example,以便我们验证还有什么问题。
  • 这是完整的可复现的例子,这是我所有的代码。
  • 什么是 tPatientName?它在哪里显示,你的主要方法是什么。只需创建一个带有 JFrame、JTextField 的 .java 文件,然后添加它们 keyListener。
  • tPatientName 是 jTextField。我把它放在JTable 中作为一列
  • 嗯,您在JTable 中拥有的信息实际上很重要,因为这可能是该行为的来源......

标签: java swing keylistener


【解决方案1】:

我根据您告诉我们的内容创建了一个MRE,它可以正常工作,没有任何问题。随意用我的小例子来比较你无法与我们分享的任何神秘代码。

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class EnterKeyTest
{
    JFrame frame;
    JPanel panel;
    JTextField tPatientName;
    
    public EnterKeyTest()
    {
        initGUI();
    }
    
    public static void main(String[] args)
    {
        EnterKeyTest e = new EnterKeyTest();
    }
    
    private void initGUI()
    {
        frame = new JFrame();
        panel = new JPanel();
        
        tPatientName = new JTextField(15);
        tPatientName.addKeyListener(new KeyAdapter()
        {
            @Override
            public void keyPressed(KeyEvent e)
            {
                if(e.getKeyCode() == KeyEvent.VK_ENTER)
                {
                    System.out.println("Saved Successfully");
                }
            }
        });
        
        panel.add(tPatientName);
        frame.add(panel);
        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

【讨论】:

  • 等等,什么?那么什么是好的做法呢?我仍然是一名初级开发人员,实际上我公司制作的每个程序都在一些构造函数中调用了 initGUI()。
  • 嗯,确实有道理。不过,我们确实总是使用专用的 GUI 类,所以这可能就是我们觉得没有真正的引用泄漏危险的原因。至少在概念上对我来说是有意义的,专用的 GUI 类将在其构造函数中初始化 GUI 创建。不管怎样,感谢您的思考!
  • 你的代码工作正常,我的完全一样。但是,它会导致问题
  • 以后,通过调用 SwingUtilities invokeLater 方法启动您的 Swing 应用程序,以便您在 Event Dispatch Thread 上创建和执行 Swing 组件
【解决方案2】:

我找到了原因。我已将jTextField 声明为静态。

我是这样的:

public static JTextField tPatientName= new JTextField();

删除 static 关键字后它起作用了。

但是,为什么static 关键字会这样做呢?

【讨论】:

  • 我又要走投无路了,带有 tPatientName 字段的类被多次使用。所以你有一个或两个实例。当您创建该类的新实例时,它使用与所有其他实例相同的“tPatientName”字段。这就是static 所做的,它将字段绑定到类,而不是实例。
  • “我已将jTextField 声明为静态。” 哦,您的意思是您声称的不可编译代码 sn-p 中未提及的文本字段是 ”。 .完整的可重现示例,这是我拥有的所有代码。”?正是这样的东西使发布minimal reproducible example 如此有用。如果你有,那么有人可能会在 3 分钟内发现问题,而不是花费 3 小时的大部分时间。 “我真的很生气。” 将来发布一个经过充分研究、很好表达的问题,你可能永远不需要感到生气。花点时间,它会得到回报的。
【解决方案3】:

将 keyPressed() 更改为 keyReleased() 有帮助吗?

【讨论】:

  • 我试过了,还是不行。
猜你喜欢
  • 2022-08-20
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多