Замораживание программы ... Использование таймера для установки задержки в цикле - PullRequest
0 голосов
/ 19 октября 2011

Предполагается, что этот метод постепенно заменяет изображение, отображаемое на JFrame, на другое изображение.Однако, без какого-либо способа замедлить его, кажется, что он просто меняется с одного изображения на новое.Чтобы замедлить его, я добавил Thread.sleep (1000), чтобы изменения не происходили мгновенно.Однако с этой строкой моя программа полностью зависает.Затем я попытался вставить таймер, как показано ниже, но программа не показала изменений при запуске.Он все еще застыл в той же точке.Кто-нибудь может помочь мне?Предложите лучший способ замедлить его, или как это можно исправить.

Для пояснения: int k - количество постепенных шагов в изменении.К = 1 будет мгновенное изменение.Все большее будет постепенным изменением.int l тем временем управляет соотношением количества отображаемого каждого изображения.

public void morphImg(int width, int height, BufferedImage morphImage, int k) {
    //creates new image from two images of same size
    final BufferedImage image2 = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    for (int l = 1; l <= k; l++) {
        for (int i = 0; i < width; i++) {
            for (int j = 0; j < height; j++) {
                //get color from original image
                Color c = new Color(image.getRGB(i, j));

                //get colors from morph image
                Color c2 = new Color(morphImage.getRGB(i, j));

                //gets colors at different stages
                int r = ((k-l)*c.getRed()/k) + (l*c2.getRed()/k);
                int g = ((k-l)*c.getGreen()/k) + (l*c2.getGreen()/k);
                int b = ((k-l)*c.getBlue()/k) + (l*c2.getBlue()/k);   
                Color newColor = new Color(r, g, b);

                //set colors of new image to average of the two images
                image2.setRGB(i, j, newColor.getRGB());
                //display new image

                imageLabel.setIcon(new ImageIcon(image2));
                final Timer t = new Timer(500,null);
                t.setInitialDelay(500);
                t.start();
            }
        }
    }

    //sets modified image as "original" for further manipulation
    setImage(image2);
}

Примечание. Вопрос - это обновление к вопросу, опубликованному здесь Программа зависает во время Thread.sleep () и с таймером

1 Ответ

0 голосов
/ 19 октября 2011

В настоящее время вы создаете один таймер на каждую итерацию цикла, но по-прежнему выполняете все итерации за один раз. Вместо этого вы должны:

  • Напишите класс для присоединения слушателя к таймеру
  • Поместите состояние в класс слушателя для всех переменных, которые вы в настоящее время получили в качестве локальных переменных, и заставьте метод actionPerformed выполнить одну итерацию вашего цикла, эффективно
  • Создать экземпляр этого класса слушателя
  • Создание одиночного таймера с прослушивателем в качестве единственного начального прослушивателя
  • На каждом таймере таймера будет вызываться actionPerformed (в потоке пользовательского интерфейса), вы будете запускать одну итерацию цикла, и пользовательский интерфейс будет обновлять

Код будет выглядеть несколько уродливо, потому что вам нужно написать код для вашего цикла for вручную - увеличить j, а если теперь он равен height, установить его в 0 и увеличить i; если , то теперь равно width, тогда установите его в 0 и увеличьте l; если , что больше k, остановите таймер.

Для получения дополнительной информации прочитайте руководство по таймеру Swing .

...