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()
,
- Для получения общей информации см. Как использовать Swing Timers.
Проблема № 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();
}
}
}
}