Причудливые проблемы с обновлением изображения для Jlabel - PullRequest
2 голосов
/ 11 декабря 2011

У меня возникли проблемы с заданием, над которым я работаю.

Часть этого заключается в том, чтобы "оживить" бросок пары кубиков.У меня есть 6 JPEG, по одной с каждой из сторон.Вместо того, чтобы катиться, я хочу, чтобы он перебирал изображения.Я пытаюсь использовать setIcon снова и снова в цикле и использовать Thread.sleep () для задержки.Это, между прочим, все происходит, когда пользователь нажимает кнопку (событие).Вместо того, чтобы отображать изображения, он ждет правильное количество времени и отображает только последнее изображение.Вот функция, которую я вызываю для выполнения цикла:

private void aniRoll(){
    for(int i = 0; i < 10; i++){
        die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face1.jpg")));
        try{
            Thread.sleep(1000); // Sleep for 1 sec
        }
        catch(InterruptedException e){}
        die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face2.jpg")));
        try{
            Thread.sleep(1000);
        }
        catch(InterruptedException e){}
        die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face3.jpg")));
        try{
            Thread.sleep(1000);
        }
        catch(InterruptedException e){}
        die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face4.jpg")));
        try{
            Thread.sleep(1000);
        }
        catch(InterruptedException e){}
        die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face5.jpg")));
        try{
            Thread.sleep(1000);
        }
        catch(InterruptedException e){}
        die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face6.jpg")));
        try{
            Thread.sleep(1000);
        }
        catch(InterruptedException e){}

    }

}

die1Disp - это имя моего JLabel, aniRoll () - функция, которую я вызываю для выполнения цикла(сделано конфиденциально, потому что я не хочу, чтобы что-то вне моего класса GUI вызывало это), а faceX.jpg - мои изображения.

Что я не могу понять, так это то, где я помещаю Thread.sleep (), он сначала задерживает программу, а затем отображает только последнее изображение.Например:

die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face1.jpg")));

die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face2.jpg")));

//bunch of extra code

try{
    Thread.sleep(10000); // Sleep for 10 sec
}
catch(InterruptedException e){}

Это будет ждать 10 секунд, а затем отображать только второе изображение.Он не быстро перелистывает первое, отображает второе, затем ждет, он ждет и отображает только второе изображение.Эта причуда действительно сбила меня с толку, и я не уверен, как это исправить.В качестве редактора я использую среду IDE NetBeans 7.01, а для базовой компоновки и генерации кода я использую палитру компонентов.

- Спасибо

Ответы [ 2 ]

3 голосов
/ 11 декабря 2011

Сначала вы должны внести изменения в поток графического интерфейса. См

SwingUtils.invokeLater.

Также Thread.sleep не собирается его обрезать, вы должны использовать javax.swing.Timer, чтобы указать, когда следует переключать значки.

1 голос
/ 11 декабря 2011

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

В вашем методе actionPerformed запустите новый поток, который будет выполнять перерисовку.Это должно это исправить.

...