我试图创建一个搜索栏,将搜索输入的字符串或字符从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.Timer
和java.util.TimerTask
:
class SearchTimerTask extends TimerTask{
@Override
public void run(){
searchFrmDb();
}
@Override
public void cancel(){
super.cancel();
//handle cancellation logic if necessary
}
}
保持对Timer
和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);
}
}