2014-11-17 5 views
0

Мне нужно создать графический интерфейс, в котором работник входит на станцию ​​(место на панели) и остается там на определенное количество секунд, показанное в обратном отсчете от головы рабочего (так, как только рабочие перемещаются на месте метки станции показывают 3s -> 2s -> 1s, а затем рабочий уходит, а метка возвращается обратно в «OPEN»). У меня возникают проблемы с тем, чтобы это произошло, поскольку я не слишком хорош с Timer (s?), Который имеет Java. Я пытался что-то вроде этого:Обратный отсчет Java gui

Timer timer = new Timer(1000, new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      //change label text/color, decrement countdown 
      panel.repaint(); 
      Thread.sleep(1000); 
     } 
    }); 

Но я не могу достичь количество секунд, чтобы отсчитывать от внутри таймера, и я не знаю, как передать это значение таймера. Если кто-то может мне помочь, я бы очень признателен.

ответ

3

Избавьтесь от Thread.sleep(). Это то, что делает 1000 в Timer(1000, new ActionListener(). Он устанавливает интервал для каждого события таймера. Каждый раз, когда запускается событие таймера, вызывается actionPerformed. Поэтому вам нужно определить, что должно произойти каждый «тик», и поместить этот код в actionPerformed. Может быть что-то вроде

Timer timer = new Timer(1000, new ActionListener() { 
    private int count = 5; 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (count <= 0) { 
      label.setText("OPEN"); 
      ((Timer)e.getSource()).stop(); 
      count = 5; 
     } else { 
      label.setText(Integer.toString(count); 
      count--; 
     } 
    } 
}); 

Вы должны решить, когда звонить timer.start().

+0

Я сделал это, и обратный отсчет GUI часть работает, но когда я пытаюсь получить работник, чтобы остановить в то время как обратный отсчет происходит (вызывая сон (1000) для второй счет), обратный отсчет не происходит, пока мой рабочий не уйдет. Таким образом, рабочий идет на станцию, останавливается на 3 секунды, а когда он уходит, отсчет начинается сверху станции. Любая идея, как я могу это исправить? – user3622688

+0

Извините, не знаю, о чем вы говорите. Для лучшей помощи отправьте [минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) –

1

Проблема № 1: Вы звоните Thread.sleep() внутри Качели GUI потока. Это заставляет поток прекратить принимать вход и заморозить. Удалите эту строку. Это тебе нехорошо! Пока вы на нем, удалите также вызов перерисовки.

Теперь, когда это сказано и сделано, вместо создания анонимного экземпляра ActionListener вы можете создать фактический класс, который реализует ActionListener и предоставляет конструктор. Этот конструктор может иметь в качестве аргумента количество секунд, с которых вы хотите начать отсчет. Вы можете объявить этот класс внутри метода, который вы используете, или можете объявить его внутри класса.

Вот скелетной пример:

public class OuterClass { 
    JLabel secondsLabel = ...; 
    Timer myTimer; 

    private void setupTimer(int numSecondsToCountDown) { 
     secondsLabel.setText(Integer.toString(numSecondsToCountDown)); 
     myTimer = new Timer(1000, new CountdownListener(numSecondsToCountDown)); 
     myTimer.start(); 
    } 

    // ... 
    class CountdownListener implements ActionListener { 
     private int secondsCount; 

     public CountdownListener(int startingSeconds) { secondsCount = startingSeconds; } 

     public void actionPerformed(ActionEvent evt) { 
     secondsLabel.setText(Integer.toString(secondsCount); 
     secondsCount--; 

     if (secondsCount <= 0) { // stop the countdown 
      myTimer.stop(); 
     } 
     } 
    } 
} 

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

  • Нет связанных вопросов^_^