【问题标题】:What to use to create search engine using onKeyReleased event使用 onKeyReleased 事件创建搜索引擎的方法
【发布时间】:2015-12-24 18:47:21
【问题描述】:

我正在尝试创建一个搜索栏,它将从 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 或其他任何东西

【问题讨论】:

    标签: java multithreading timer javafx keyrelease


    【解决方案1】:

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

    【讨论】:

    • 有必要创建一个类SearchTimerTask 吗?因为我有控制器类,我在其中编写此代码
    • 好吧,你需要一个 TimerTask 类的实现才能将它安排在 Timer 上。如果要将逻辑保留在控制器中,可以将此类作为(匿名)内部类添加到控制器类中。
    【解决方案2】:

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

    【讨论】:

    • 我想要的确切答案,但我需要将参数传递给searchFrmDb ()
    • 是什么阻止您将参数传递给方法?
    • keyReleased 事件中我有一个要传递的数组...我该怎么做?
    • 更新您的问题以表明您的意思。在问题中,您没有将任何内容传递给该方法。
    • 非常感谢...你是救世主
    猜你喜欢
    • 2018-11-12
    • 1970-01-01
    • 2013-11-27
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 2010-09-25
    相关资源
    最近更新 更多