javax.swing.jframe setText () в цикле? + преднамеренная задержка?
-
22-10-2019 - |
Вопрос
Я очень новичок в Java (использовал ее только около недели), и я работаю над симулятором магазина. По сути, я просто хочу сделать основные вещи прямо сейчас, например, иметь время до закрытия и время с момента открытия переменной, отображаемой на экране.
Я сделал следующие функции в моем моделировании расширяет javax.swing.jframe class:
public void incOpenTime() {
timeOpen++;
int hours = timeOpen / 3600;
int minutes = (timeOpen % 3600) / 60;
int seconds = (timeOpen % 3600) % 60;
this.openTime.setText((hours < 10 ? "0" : "") + hours
+ ":" + (minutes < 10 ? "0" : "") + minutes
+ ":" + (seconds < 10 ? "0" : "") + seconds);
decTimeLeft();
}
public void decTimeLeft() {
int remainingTime = 28800 - timeOpen;
int hours = remainingTime / 3600;
int minutes = (remainingTime % 3600) / 60;
int seconds = (remainingTime % 3600) % 60;
this.timeLeft.setText((hours < 10 ? "0" : "") + hours
+ ":" + (minutes < 10 ? "0" : "") + minutes
+ ":" + (seconds < 10 ? "0" : "") + seconds);
}
Переменные Opentime и Timeleft с использованием метода setText () являются частью самого графического интерфейса.
В основном я называю подобным образом так:
while(this.timeOpen < 28800)
{
incOpenTime();
}
Во -первых, когда я запускаю это, это в основном проходит через петлю и выводит только в последний раз на экран. Как бы я сделал так, чтобы время постоянно менялось?
Во -вторых, я хотел бы немного отложить его ... может быть, около 1 мс в секунду, поэтому моделирование работает медленнее, а другие данные выводятся на экран (позже) более читаемо. Я пробовал Thread.sleep (1); В цикле, но он не отображает цифры по мере их изменения.
Пожалуйста помоги.
Спасибо
РЕДАКТИРОВАТЬ:
Вот что я сделал, чтобы заставить это работать. В главном:
timer = new Timer();
for(int i=1; i<= 28800; i++)
{
timer.schedule(new task(), 1*i);
}
Сделал новый класс:
class task extends TimerTask {
@Override
public void run() {
incOpenTime();
}
}
Решение
Ты нуждаешься в java.util.Timer
РЕДАКТИРОВАТЬ: Поскольку это принятый ответ, важно отметить, что TimerTask
должен выполнить его Runnable
в ветке отправки событий. Правильный вариант этого подход отмечается в @mkorbel's отвечать. Анкет Есть короткий пример ниже и более сложный здесь. Анкет Несколько более простой подход, предложенный @hovercraft, видна здесь.
class Task extends TimerTask {
@Override
public void run() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
incOpenTime();
}
});
}
}
Другие советы
javax.swing.Timer
может быть хорошим выбором, как «обработки событий для действий Timers
Выполните на… сборочный поток. "Есть пример здесь.
Ваш вывод из задачи или потока BackGroung в графический интерфейс неправильно опубликован в EDT,
Вы должны обернуть вывод в графический интерфейс (от задачи или потока BackGroung) до
invokeLater()
Если бы метод мог быть синхронизирован, тогда
invokeAndWait()
Пожалуйста, прочитайте больше о Согласованность в качелях