Вопрос

Я очень новичок в 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()

Пожалуйста, прочитайте больше о Согласованность в качелях

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top