0

我正在尝试创建一个搜索栏,它将从 db 中搜索输入的字符串或字符。在文本字段中输入第一个字符时,它应该等待接下来的 200 毫秒,如果在该时间内输入了下一个字符,那么它将重新启动计数器并再次等待接下来的 200 毫秒,否则它将从 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新手帮我解决我的问题我应该使用什么threadTimer其他什么

4

2 回答 2

3

考虑使用这样的PauseTransitionfor 功能。

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();
       }
    }

}
于 2015-09-27T12:53:32.987 回答
0

我会看看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
    }
}

在某处保留对 aTimer和 a的引用:TimerTask

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);
   }
}
于 2015-09-27T11:57:09.530 回答