Java графический интерфейс

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

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

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

2 ответа

Избавиться от 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(),

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

Теперь, когда все сказано и сделано, вместо создания анонимного экземпляра 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();
         }
      }
   }
}
Другие вопросы по тегам