Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Поиск в JTable с задержкой


Автор: KidA 27.9.2006, 16:58
Добрый день всем.

Есть таблица. Поиск в таблице начинается сразу после ввода символа в JTextField. Если таблица большая (несколько тысяч записей), то поле ввода зависает, потому что уже пошел поиск. Поэтому трудно ввести сразу 4-5 символов, по которым нужен поиск.

Задача следующая: 
Как начать поиск не сразу, а по истечении некоторого времени, например, 1 сек.


Автор: LSD 27.9.2006, 17:25
Когда пользователь вводит в JTextField букву, запускай таймер на 1-2 сек. По истечении которого начинай поиск. Если пользователь вводит еще букву, то проверяешь было ли выполнено предыдущее задание, если нет, то отменяешь его и создаешь новое.

Автор: powerOn 27.9.2006, 17:29
задержку можно сделать вызовом Thread.sleep(1000) к примеру; Но тут еще больше вопросов возникает с синхронизацией и определением моментов, когда можно считать, что пользователь ввел нужную комбинацию символов, а когда еще только вводит.

А вообще, не плохо бы кнопку поставить, по нажатию которой стартует поиск. Или сам поиск как-то оптимизировать, чтобы зависаний небыло.

Автор: LSD 27.9.2006, 17:46
Цитата(powerOn @  27.9.2006,  18:29 Найти цитируемый пост)
задержку можно сделать вызовом Thread.sleep(1000) к примеру

Если мы так сделаем в коде обработчика события, то остановим AWT-шный поток и результат будет даже хуже чем сейчас. А если создавать отдельный тред, то надо думать как ему отсрочить запуск поиска, если пользователь ввел еще один символ в поле, т.е. фактически получим тот же таймер.

Автор: KidA 27.9.2006, 17:54
а возможно ли это сделать без нового треда(ради поиска вводить пятый поток не хочется)?

Автор: LSD 27.9.2006, 18:08
Без нового треда нет, полюбому. Но можно обойтись одним таймером на все приложение (плюс он много еще чего может делать).
Код
{
  public static final int DELAY = 1000;

  private SearchTask task;
  private Timer timer = new Timer("my-application-timer", true);

  public void keyReleased(KeyEvent e)
  {
    if(task != null)
      task.cancel();
    task = new SearchTask(textArea.getText());
    timer.schedule(task, DELAY);
  }

  private class SearchTask extends TimerTask
  {
    public SearchTask(String textToFind)
    {
      ....
    }

    public void run()
    {
      //do search
      task = null;
    }
  }
}

Автор: KidA 27.9.2006, 18:15
большой пасиб

Автор: powerOn 27.9.2006, 19:31
Цитата(LSD @  27.9.2006,  18:46 Найти цитируемый пост)
Цитата(powerOn @  27.9.2006,  18:29 Найти цитируемый пост)
задержку можно сделать вызовом Thread.sleep(1000) к примеру

Если мы так сделаем в коде обработчика события, то остановим AWT-шный поток и результат будет даже хуже чем сейчас. А если создавать отдельный тред, то надо думать как ему отсрочить запуск поиска, если пользователь ввел еще один символ в поле, т.е. фактически получим тот же таймер.



Когда это писал, я подразумевал, что данный метод (Thread.sleep(1000)) будет вызван в потоке поиска, и естественно, не в потоке рассылки сообщений.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)