Java установить задержку для изменения изображения

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

нажмите кнопку-> установить изображение-> задержка-> установить другое изображение.

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

также я не хочу использовать таймеры, я хочу использовать задержки.

и вот та часть моего кода, которая меня беспокоит.

btnNewButton.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
    lblNewLabel.setIcon(and);   
sleeep(500);
        lblNewLabel.setIcon(app);
    }
});

а вот функция задержки

 void sleeep(int n)
{
    try {
        Thread.sleep(n);
    } catch(InterruptedException ex) {
        Thread.currentThread().interrupt();
    }
}

person Youssef Fotouh    schedule 13.11.2013    source источник
comment
продублировано: stackoverflow. ком/вопросы/10051638/   -  person tokhi    schedule 13.11.2013
comment
@tokhi разве я не упоминал, что не хочу использовать таймеры.   -  person Youssef Fotouh    schedule 13.11.2013


Ответы (2)


  1. не добавляйте MouseListener в JButton, а для mouseClicked() добавьте ActionListener вместо этого, кстати, все события Mouse и Key реализованы в JButton API и правильно

  2. не используйте Thread.sleep(n); у вас проблема с параллельным доступом в Swing вместо этого используйте Swing Timer,

person mKorbel    schedule 13.11.2013
comment
добавление прослушивателя действий дало тот же результат, плюс я упомянул, что не хочу использовать таймеры. - person Youssef Fotouh; 13.11.2013
comment
тогда результат никогда не будет стабильным - person mKorbel; 13.11.2013
comment
я намерен заморозить всю программу, пока изображения меняются, поэтому я не хочу использовать таймеры .... я знаю, что могу сделать объекты неактивными, пока таймер работает, но использование задержки было бы намного проще. - person Youssef Fotouh; 13.11.2013

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

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        lblNewLabel.setIcon(and);
    }
});

sleeep();

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        lblNewLabel.setIcon(and);
    }
});
person Luke    schedule 13.11.2013
comment
Это не будет работать надежно, пока вы не выполните sleep в другом потоке, а затем запланируете invokeLater для установки последнего значка. - person Harald K; 13.11.2013