Чередование изображений с помощью таймера с использованием Java - PullRequest
1 голос
/ 03 марта 2011

Поскольку я не учусь в CS, у меня возникли некоторые трудности с переводом моих пожеланий по программированию в реальную программу. В основном это сводится к следующему: как я могу чередовать изображение на этикетке, показывая каждому изображению количество времени, характерное для каждого изображения.

Итак: скажем, у меня есть образы А и В; Я хотел бы, чтобы пользователь видел A для 1000 мс и B для 200 мс. Это продолжается до тех пор, пока пользователь не нажмет определенную клавишу.

Теперь я могу загрузить изображение на панель, довольно легко даже, и мне удалось поймать пользовательский ввод, используя KeyListener и прочее, все это работает довольно хорошо и намного проще, чем я ожидал. Я также знаю, как использовать циклические конструкции, такие как while, for и do.. while, но это таймерное дело.

Я вижу все что угодно, используя потоки, а что нет, мне это действительно не нужно. Это не эффективное программирование или хороший код, это просто демонстрация чего-либо. Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

0 голосов
/ 03 марта 2011

Нет ничего неэффективного в использовании потоков, когда потоки являются подходящим инструментом для работы.

В этом случае было бы неразумно создать новый класс, реализующий Runnable, который содержитссылка на метку, на которую вы хотите изменить изображение.

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

Вы хотели бы избежать 'Busy Loops' [в основном, цикла while, в котором нет Thread.sleep () внутри), и посмотреть, есть ли какие-либо необходимые критерии выхода из потока

0 голосов
/ 03 марта 2011

Используйте SwingWorker<Void, Void>.Метод doInBackground в SwingWorker должен выглядеть следующим образом:

@Override
protected Void doInBackground() {
    try {
        while (true) {
            displayImage(imageA);
            Thread.sleep(1000L);
            if (isCancelled()) {
                return null;
            }
            displayImage(imageB);
            Thread.sleep(200L);
            if (isCancelled()) {
                return null;
            }
        }
    }
    catch (InterruptedException e) {
        // ignore
    }
    return null;
}

private void displayImage(final Icon image) {
    SwingUtilituies.invokeLater(new Runnable() {
        @Override
        public void run() {
            // display the image in the panel
        }
    });
}

Для списка ключей следует просто отменить SwingWorker.

0 голосов
/ 03 марта 2011

Вот кое-что, что может быть хорошим примером: http://www.java2s.com/Code/Java/Development-Class/UsejavautilTimertoscheduleatasktoexecuteonce5secondshavepassed.htm

Я могу попытаться объяснить код, если он выглядит запутанным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...