如何使用onKeyReleased事件创建搜索引擎



我试图创建一个搜索栏,将搜索输入的字符串或字符从db。当在文本框中键入第一个字符时,它应该等待下一个200ms,如果在该时间内输入下一个字符,则它将重新启动计数器,并再次等待下一个200ms,如果没有,则它将从db中搜索。

这里是一些代码,我尝试过,但不适合我

@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新手,帮助我解决我的问题我应该用thread还是Timer或者其他什么

考虑使用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();
       }
    }
}

我想看看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);
   }
}

相关内容

  • 没有找到相关文章

最新更新