Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按键事件被多次调用_Java_Swing_Keylistener - Fatal编程技术网

Java 按键事件被多次调用

Java 按键事件被多次调用,java,swing,keylistener,Java,Swing,Keylistener,我有一个jTextField,并在其中添加了一个键侦听器。因此,如果我键入某个内容并按Enter键,将调用按下的事件,然后我将保存键入的内容 但是,如果我按Enter键,它会被调用3次 tPatientName.addKeyListener(new java.awt.event.KeyAdapter() { @Override public void keyPressed(java.awt.event.KeyEvent e) { if(

我有一个
jTextField
,并在其中添加了一个键侦听器。因此,如果我键入某个内容并按Enter键,将调用按下的事件,然后我将保存键入的内容

但是,如果我按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
我不知道我的代码出了什么问题。
提前感谢。

将按键按下()更改为按键释放()有帮助吗?

我根据您告诉我们的内容创建了一个
MRE
,它可以正常工作。请随意将您无法与我们共享的任何神秘代码与我的小示例进行比较

导入java.awt.event.KeyAdapter;
导入java.awt.event.KeyEvent;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JTextField;
公共类EnterKeyTest
{
JFrame框架;
JPanel小组;
JTextField tPatientName;
PublicEnterKeyTest()
{
initGUI();
}
公共静态void main(字符串[]args)
{
EnterKeyTest e=新的EnterKeyTest();
}
私有void initGUI()
{
frame=新的JFrame();
panel=新的JPanel();
tPatientName=新的JTextField(15);
tPatientName.addKeyListener(新的KeyAdapter()
{
@凌驾
按下公共无效键(按键事件e)
{
如果(例如getKeyCode()==KeyEvent.VK_ENTER)
{
System.out.println(“保存成功”);
}
}
});
面板。添加(tPatientName);
框架。添加(面板);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}

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

我是这样的:

public static JTextField tPatientName= new JTextField();
删除
static
关键字后,它工作了


但是,为什么
static
keyword要这样做呢?

对我来说效果很好。发布一篇文章,这样我们就可以验证还有什么可能是错误的。这是一个完整的可复制的例子,这是我所有的代码。什么是tPatientName?它显示在哪里,你的主要方法是什么。只需创建一个带有JFrame、JTextField的.java文件,并将其添加到keyListener.tPatientName是一个
JTextField
。我把它放在
JTable
中作为一个专栏,你在
JTable
中得到的信息实际上很重要,因为这就是这种行为的来源……我已经试过了,它不起作用。等等,什么?那么什么是好的实践呢?我仍然是一名初级开发人员,实际上我公司开发的每个程序都有一些构造函数调用
initGUI()。不过,我们总是使用专用的GUI类,所以这可能就是为什么我们感觉不到引用泄漏的真正危险的原因。对于我来说,一个专用的GUI类将在其构造函数中初始化GUI创建,这至少在概念上是有意义的。不管怎样,谢谢你的深思熟虑!你的代码运行良好,我的代码完全相同。但是,这会带来问题。在将来,通过调用SwingUtilities invokeLater方法启动Swing应用程序,这样您就可以在Ill go out上创建并执行Swing组件了。同样,带有tPatientName字段的类会被多次使用。所以你有一两个例子。当您创建该类的新实例时,它将使用与所有其他实例相同的“tPatientName”字段。这就是
static
所做的,它将字段绑定到类,而不是实例。“我已经将
jTextField
声明为static。”哦,你的意思是,在你声称的不可编译代码片段中没有提到的文本字段是“。完整的可复制示例,就是我所有的代码。”?正是这样的东西使得发帖变得如此有用。如果你有,可能有人会在3分钟内发现问题,而不是花3个小时的大部分时间。“我真的很生气。”在将来发布一个经过充分研究、表达得很好的问题,你可能永远都不需要感到厌烦。慢慢来,会有回报的。