0

入力した文字列または文字をデータベースから検索する検索バーを作成しようとしています。最初の文字がテキスト フィールドに入力されている間、次の 200 ミリ秒を待機する必要があります。次の文字がその時間内に入力された場合はカウンターを再起動し、そうでない場合は次の 200 ミリ秒を再度待機し、データベースから検索します。

これは私が試したがうまくいかないコードです

@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ます

4

2 に答える 2

3

PauseTransitionこのような for 機能の使用を検討してください。

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.Timerますjava.util.TimerTask

class SearchTimerTask extends TimerTask{
    @Override
    public void run(){
        searchFrmDb();
    }

    @Override
    public void cancel(){
        super.cancel();
        //handle cancellation logic if necessary
    }
}

Timeraと 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 に答える