2015-08-12 4 views
1

Я создал простой класс таймера, который отсчитывает от 20 до нуля, если его переменная timerStop не установлена ​​в true и обновляет JTextFiled в массиве графических интерфейсов после каждой секунды. Каждый раз, когда используется таймер, создается новый GameTimer и передается в новый поток.Java - переменная темы, сохраняющая предыдущее значение

ПРОБЛЕМА: Первый запуск таймера выполняется так, как ожидалось, но последующие экземпляры начнутся с обновления текстового поля графического интерфейса с последним значением предыдущего таймера (номер, на котором он был остановлен), прежде чем считать с 20 по мере того, как он должен.

Я попытался сбросить переменную обратно до 20 в конце кода и распечатать значение в качестве теста, а переменная действительно печатает «20», но все же графический интерфейс пользователя обновляет предыдущее время остановки, когда запускается следующий экземпляр.

Я использую Netbeans 8.0.2 IDE

Действительно признателен за любые советы и подсказки по поводу моего кода, спасибо!

public class GameTimer implements Runnable 
{ 
    private volatile int secondsLeft; 
    private MultiTextGUI[] guis; 
    private boolean timerStop; 

    public GameTimer(MultiTextGUI[] MTguis) 
    { 
    secondsLeft = 20; 
    guis = MTguis; 
    timerStop = false; 
    }  

    public void setTimerStop(boolean stop) 
    { 
    timerStop = stop; 
    }   

    @Override 
    public void run() 
    { 
     while (secondsLeft > 0 && !timerStop) 
     { 
     try 
     { 
     Thread.sleep(1000); 
     } 
     catch (Exception e) 
     { 
     System.out.println("Error: " + e.toString()); 
     }  
     secondsLeft--; 
     System.out.println(secondsLeft); //TEST 
     for (MultiTextGUI gui: guis) 
     { 
      if (secondsLeft > 0) 
      { 
      if (gui != null) 
      {  
       gui.updateTimer(secondsLeft); 
      } 
      } 
      else 
      { 
      if (gui != null) 
      {  
       gui.setTimerOn(false); 
      } 
      } 
     } 

     } 
     secondsLeft = 20; 
     System.out.println(secondsLeft); //TEST 
    } 
} 

Главная Тема:

GameTimer gt = new GameTimer(g); 
Thread timerThread = new Thread(gt); 
timerThread.start(); 

//code to show timer in gui 
//code for countdownlatch 

gt.setTimerStop(true); 

ответ

0

Если вы используете компоненты Swing, необходимо обновить эти компоненты с помощью событий отправки потока. Обновление компонента в нормальном потоке вызовет всевозможные проблемы.

SwingUtilities.invokeLater - это то, что вы должны использовать при обновлении компонента Swing.


В следующем коде утверждается, что утверждения, содержащиеся в выполнении, выполняются в потоке отправки событий. Причина, по которой это важно, заключается в том, что вы можете повредить состояние своего пользовательского интерфейса swing (предполагая, что это то, что используется здесь). Покраска GUI является однопоточной, и если вы входите и обновляете компонент за пределами этого единственного потока (EDT), тогда EDT может оказаться в середине обновления вашего компонента сразу, когда вы находитесь. Коррупция является наименьшей из проблем.

Настоящая коварная часть этого заключается в том, что обновление компонентов за пределами EDT будет работать в 90% случаев. Тогда, когда вы меньше всего этого ожидаете, происходит что-то сумасшедшее. Возможно, ваша проблема здесь не связана с этим, но по-прежнему важно обновить Swing в EDT.

Имеются учебные пособия.

SwingUtilities.invokeLater(new Runnable() 
{       
    public void run() 
    { 
     label.setText("New Value=" + x); 
    } 
}); 
+0

поэтому метод updateGUI() должен запускаться в EDT? Не могли бы вы показать мне простой пример того, как это сделать, пожалуйста. –

0

Вы спали в течение одной секунды перед обновленным значением, установленным в экземплярах MultiTextGUI. Если дисплей обновляется до этого 1-го периода, поток, запускающий таймер, не обновил отображаемое значение, вызывающее отображение предыдущего значения. Не уверен, что вы можете установить значение перед вызовом Thread.sleep (1000) и сохранить поведение, которое вы хотите.

Смежные вопросы