Java JTextField在过去2秒钟内未触发任何更改事件后发送数据

Java JTextField在过去2秒钟内未触发任何更改事件后发送数据,java,multithreading,delay,textfield,Java,Multithreading,Delay,Textfield,要求很简单: 文本字段用于从用户处获取一些信息。如果用户在最后2秒钟内未键入新字符,则使用文本字段中的文本并将其提交到某个界面。接口还不重要 我必须将propertyChange或密钥侦听器附加到textfield。每次用户添加新字符时,我的内部字符串缓冲区都会更新 问题: 我需要一些模板或设计模式来实现一个异步线程,该线程在触发操作之前等待2秒。在2秒钟的延迟内,线程可以重置,因此线程将再次等待2秒钟 因此,如果文本字段更改,线程将重置。如果线程等待2秒,则可以使用文本字段数据填充接口 我想创

要求很简单: 文本字段用于从用户处获取一些信息。如果用户在最后2秒钟内未键入新字符,则使用文本字段中的文本并将其提交到某个界面。接口还不重要

我必须将propertyChange或密钥侦听器附加到textfield。每次用户添加新字符时,我的内部字符串缓冲区都会更新

问题: 我需要一些模板或设计模式来实现一个异步线程,该线程在触发操作之前等待2秒。在2秒钟的延迟内,线程可以重置,因此线程将再次等待2秒钟

因此,如果文本字段更改,线程将重置。如果线程等待2秒,则可以使用文本字段数据填充接口


我想创建一个2秒延迟的线程,如果检测到文本字段的变化,就中断这个线程。线程被中断后,将触发一个新的延迟线程,但我想知道是否有人知道我可以直接使用的java类。

我实现过一次,您可以使用
java.swing.Timer
例如,只需将repeation设置为false(仅触发一次),并在用户每次输入字符(测试代码)时重置它

例如:

import javax.swing.Timer;

...

private Timer t; //declare "global" timer (needs to bee seen from multiple methods)

private void init() {

    t = new Timer(2000, putYourUsefullActionListenerHere);
    //the one that will acctually do something after two seconds of no change in your field

    t.setRepeats(false); // timer fires only one event and then stops
}

private void onTextFieldChange() { //call this whenever the text field is changed
    t.restart();
    //dont worry about "restart" and no start, it will just stop and then start
    //so if the timer wasnt running, restart is same as start
}

private void terminate() {
    //if you want for any reson to interrupt/end the 2 seconds colldown prematurelly
    //this will not fire the event
    t.stop();
}
我必须将propertyChange或密钥侦听器附加到textfield

您应该使用DocumentListener。无论何时在文本字段中添加/删除文本,都会通知您


有关更多信息和示例,请阅读上Swing教程的部分。本教程还有一节介绍如何使用摆动计时器建议摆动计时器-1因为没有在论坛上发布代码。@camickr:更好吗?:)+我想接受两个答案,但只能是一个。谢谢!