2015-09-27 24 views
0

我想创建一个搜索栏,将搜索从数据库输入的字符串或字符。当第一个字符在文本框中输入时,它应该等待下一个200ms,如果在该时间内输入了下一个字符,那么它将重新启动计数器,如果不是,则等待下一个200ms,然后它将从数据库搜索。什么使用onKeyReleased事件创建搜索引擎

下面是一些代码,我试过,但我不行

@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或其他任何

回答

3

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

} 
+0

我想要的确切答案,但我需要将参数传递给'searchFrmDb()' –

+1

阻止您将参数传递给该方法的是什么?在'keyReleased'事件中有 –

+0

事件我有一个数组,我想传递...我怎么能? –

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 
    } 
} 

保持到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); 
    } 
} 
+0

是否需要创建一个'SearchTimerTask'类?因为我有一个控制器类,我在其中编写代码 –

+0

,所以您需要一个'TimerTask'类的实现,以便能够将其安排在'Timer'上。如果要将逻辑保存在控制器中,可以将此类作为(匿名)内部类添加到控制器类。 –

相关问题