使用 onKeyReleased 事件创建搜索引擎的用途

What to use to create search engine using onKeyReleased event

我正在尝试创建一个搜索栏,它将从数据库中搜索输入的字符串或字符。当在文本字段中输入第一个字符时,它应该等待接下来的 200 毫秒,如果在这段时间内输入下一个字符,那么它将重新启动计数器,如果没有再次等待接下来的 200 毫秒,那么它将从数据库中搜索。

这是一些我试过但对我不起作用的代码

@FXML protected void keyReleased(KeyEvent evt)throws Exception {
   if (evt.getCode() != KeyCode.BACK_SPACE) {
       String ch = evt.getText();
       String[] myArray = new String[5];
       run();
       searchFrmDb(ch, myArray);
   }
}
public void run(){
   for(int i=1;i<5;i++){
      try{
          Thread.sleep(200);
      }catch(InterruptedException e){System.out.println(e);}
     System.out.println(i);

    } 
}
public void searchFrmDb(String ch,String[] myArray){
     //db search operation ...
}

我是新手 java 帮我解决一下我的问题 我应该使用什么 threadTimer 或其他什么

我会看看 java.util.Timerjava.util.TimerTask:

class SearchTimerTask extends TimerTask{
    @Override
    public void run(){
        searchFrmDb();
    }

    @Override
    public void cancel(){
        super.cancel();
        //handle cancellation logic if necessary
    }
}

在某处保留对 TimerTimerTask 的引用:

Timer timer = new Timer();
TimerTask task;

然后在您的按键事件处理程序中,您只需取消当前任务(如果有)并启动一个新任务:

@FXML protected void keyReleased(KeyEvent evt)throws Exception {
   if (evt.getCode() != KeyCode.BACK_SPACE) {
        if(task != null){
            task.cancel();
            task = new SearchTimerTask();
        }
        timer.schedule(task, 200);
   }
}

考虑使用 PauseTransition 实现这样的功能。

public class ControllerClass {

    private final PauseTransition pauseBeforeSearch = new PauseTransition(Duration.millis(200));

    @FXML protected void keyReleased(KeyEvent evt)throws Exception {
       if (evt.getCode() != KeyCode.BACK_SPACE) {
           pauseBeforeSearch.setOnFinished(e -> {
               searchFrmDb(evt.getText(), new String[5]);
           });
           pauseBeforeSearch.playFromStart();
       }
    }

}