Где я должен использовать thread.sleep в Java-программе Swing? - PullRequest
1 голос
/ 08 февраля 2012

Прямо сейчас я запрограммировал метод для использования в программе свинга, который должен замедлять скорость, с которой вызывается метод, который выполняется (через thread.sleep (x)), а не замедлять скорость обновления.это просто вызывает зависание всей программы и обновление экрана в конце выполнения методов.

Вот мой код:

public final void doBubbleSort(String numbers[], JButton numButton[]){
for (int k = 0; k < numbers.length - 1; k++){  
  String str1 = "";
  boolean isSorted = true;  

  for (int i = 1; i < numbers.length - k; i++){  
     if (Integer.parseInt(numbers[i]) < Integer.parseInt(numbers[i - 1])  ){  
        try{
        String tempVariable = numbers[i];  
        numbers[i] = numbers[i - 1];  
        numbers[i - 1] = tempVariable;  
        isSorted = false; 
        str1 = numButton[i].getText();
        numButton[i].setText(numButton[i-1].getText());
        Thread.sleep(100);
        }catch(Exception e){ System.err.println("Error: " +e.getMessage()); }
        numButton[i-1].setText(str1);
     }   
  }  

  if (isSorted)  
     break;  

}

}

Если кто-нибудь подскажет мне, куда я должен поместить thread.sleep (), чтобы он задерживал отображение заменяемых элементов, я был бы очень признателен.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 08 февраля 2012

Вы никогда не должны спать в потоке отправки событий.

  1. Создайте модель , (в вашем случае список)
  2. Создать представление (ваш графический интерфейс)
  3. Убедитесь, что представление обновляется после изменения модели (например, добавив listener )
  4. Создайте отдельный поток , который регулярно обновляет модель (используя Thread.sleep, если хотите)
  5. При изменении «скорости» изменить время ожидания для потока обновлений

Возможно, вы захотите взглянуть на класс Timer (который обеспечивает более приятный интерфейс для регулярных действий) или на Swing Workers.

4 голосов
/ 08 февраля 2012

Вы не можете сделать анимацию, поместив цикл в обработчик событий, подобный этому.Вы должны сделать это, используя отдельный поток, либо явно, либо используя класс javax.swing.Timer.Если вы зацикливаетесь и спите в потоке событий, как вы это делаете, то в течение всего времени выполнения цикла поток событий будет недоступен для выполнения других своих функций, таких как рисование экрана.

См. эта статья для получения информации об использовании класса таймера Swing.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...