2013-04-03 3 views
1

У меня есть значок для JLabel, который я могу увидеть изменение только один раз. Когда пустое, новое заданное изображение для приведенного ниже кода работает так, как должно. Но после этого изображение застревает. Никакое новое изображение не может заменить его. Когда я использую repaint on panelPainting без revalidate(), я не получаю никаких изображений вообще. Это тоже странно.JLabel Icon resisting change

Вот код (panelMain дома panelPainting)

//get image from somewhere 
JLabel imageLabel = new JLabel(); 
Icon imageIcon = new ImageIcon(image); 
imageLabel.setIcon(imageIcon); 

panelPainting.setAlignmentX(JLabel.CENTER); 
panelPainting.add(imageLabel); // default center section 

//my insanity starts here 
panelPainting.revalidate(); 

panelMain.remove(panelPainting); 
panelMain.revalidate(); 

EDIT: Я проверил, что изображение меняет каждый раз.

ответ

4
  • использование JLabel.setIcon(), как стандартный способ, то нет причин, чтобы удалить, изменить и добавить новый JComponents во время выполнения

  • в некоторых случаях существует проблема с перекраской Icon в JLabel (от внешних источников, WWW-сайты и т.д.), то вы должны позвонить,

myIcon.getImage().flush(); 
myLabel.setIcon(myIcon); 
  • использование CardLayout с несколькими видами, то любое действие только для переключения Betweens карты

иначе

  • должны вызвать container.revalidate() и container.repaint(), как последние строки кода, один раз, после всех изменений

  • для лучшей помощи рано опубликовать SSCCE, короткий, работоспособный, компилируется, только о JFrame с JLabel содержит ImageIcon/Icon created on fly

+0

Я пытался ваше предложение, и я только что заметил что-то неловко. Новые изображения есть все же, но рядом друг с другом. Он просто добавил изображения бок о бок вместо замены ... – mechanicum

+0

1. then container.revalidate() и container.repaint() работает во всех случаях, 2. конечный результат зависит от используемого LayoutManager для JPanel, возможно, для JList , изменить пример кода из JComboBoxand image renderer из учебника Oracle – mKorbel

+0

Да, ваш ответ показал путь. По-видимому, panelPaintings добавил компоненты ярлыков, но не заменил их. ** panelMain.remove (panelPainting); ** также не требуется. Спасибо. – mechanicum