2015-11-17 5 views
0

У меня есть два класса: логика и JFrame. В кадре у меня есть JLabel и JButton, и я хотел бы:Change ImageIcon в JLabel с использованием таймера

Когда эта кнопка нажата, то ImageIcon в изменениях метки после определенного времени с использованием свинга Timer, как если он мигает. Для этого я загрузил два изображения с разной яркостью (img1b и img1). Я попытался сделать таймер изменением изображения дважды с разными задержками, но я не увенчался успехом. Я также поставить слушателя в кнопке и реализован actionPerformed, как показано ниже:

public void actionPerformed(ActionEvent e) { 
    if(e.getSource().equals(btnImg1)) { 
     logic.piscaImagen(img1, lblImg1); 
     logic.piscaImagen(img1b, lblImg1); 

В логическом классе:

public void piscaImagen(ImageIcon img, JLabel lbl) { 

     Timer timer = new Timer(1250, null); 
     timer.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent evt){ 
       if(lbl.getIcon() != img){ 
        lbl.setIcon(img); 
      } 
     } 
     }); 
     timer.setRepeats(false); 
     timer.start(); 
} 

Но когда я запускаю его ничего не меняется в logic.piscaImagen. Какие-нибудь советы?

+1

Чтобы лучше помочь, опубликуйте [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –

+0

BTW - Я бы рекомендовал сделать это поэтапно. 1) Покажите оба изображения в двух меток в кадре. 2) Установите повторяющийся таймер во время инициализации графического интерфейса, чтобы изменить изображения на ** одиночной ** этикетке. 3) Установите повторение ложного (с большой задержкой) и проверьте его еще раз. 4) Укоротите задержку и попробуйте ее нажатием кнопки (а не при запуске). –

ответ

-1

EDIT: ответ неточный, repaint() не требуется - см. Комментарии.


Вы пропустили repaint() звонок, сообщающий программу, необходимую для обновления дисплея.

@Override 
public void actionPerformed(ActionEvent evt) { 
    if(lbl.getIcon() != img){ 
     lbl.setIcon(img); 
     lbl.repaint(); 
    } 
} 

(ваш if заявление также отсутствует закрывающая скобка, не зная, что влияние, которое будет иметь/если это опечатка)

+0

Вам не нужен repaint(). Когда вы изменяете свойство компонента Swing, компонент вызывает 'revalidate()' и 'repaint()' на себе, чтобы убедиться, что он перекрашен. – camickr

+0

В частности, только при изменении свойства? Например, добавление/удаление компонентов не вызывает этого. Клянусь, что раньше у меня были проблемы с 'repaint', но я переместился в основном на' paintComponent' переопределения в эти дни. – Gorbles

+1

При добавлении/удалении компонентов из панели вам нужно вызвать 'revalidate()' на панели, чтобы вызвать диспетчер компоновки (иначе новый компонент будет иметь размер 0).Обычно панель будет перерисовываться, но я всегда добавляю 'repaint()' только для того, чтобы убедиться. 'но я переместился в основном на paintComponent переопределяет эти дни' - если вы делаете обычную роспись, тогда вам нужна перерисовка, но опять-таки лучший дизайн - это иметь метод setter для свойств вашего класса, а затем метод setter вызывает revalidate() и перерисовать, а не код приложения. – camickr

1
logic.piscaImagen(img1, lblImg1); 
logic.piscaImagen(img1b, lblImg1); 

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

Все, что вам нужно, это один таймер. Каждый раз, когда срабатывает таймер, вы меняете изображение. Таким образом, основной код в ваш таймер будет:

if (lbl.getIcon() == img1) 
    lbl.setIcon(img1b); 
else 
    lbl.setIcon(img1); 

Или для более гибкого решения, которое вы можете использовать Animated Icon.

Animated Icon позволит вам указать список значков для отображения. Затем, когда срабатывает таймер, отображается следующий значок в списке. Вы можете установить Animated Icon для непрерывного отображения или вы можете контролировать количество циклов.

+0

Как побочный вопрос, я быстро посмотрел на вашу Анимированную иконку - есть ли какой-то реальный недостаток в настройке анимации любым другим способом (т. Е. Класс «Runnable», переворачивающий каждые X миллисекунды)? Предположим, что приложение с графическим интерфейсом, а не сложная 2D-рендеринговая сцена, конечно. – Gorbles

+0

Точно, я хочу изменить изображение, а затем восстановить его, но после некоторой задержки (2000 мс) в документе это простая задача, но я не могу заставить ее работать. – user3111762

+0

@Gorbles, обновления компонентов Swing должны быть выполнены в потоке отправки событий (EDT). Прочтите учебное пособие [Concurrency in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html) для получения дополнительной информации. Кодирование таймера качания выполняется на EDT, а Thread Runnable - нет. – camickr

Смежные вопросы