Изменить значок jLabel

Кажется, я не единственный с этим вопросом, но я не могу найти ответ, который решает проблему.

Я создал Label и присвоил ему Icon с помощью WYSIWYG interface designer.
Теперь я хочу динамически менять значок во время выполнения.

Логический способ будет таким (моя первая попытка):

ImageIcon newIcon = new ImageIcon("SomePath");
jLabel1.setIcon(newIcon); 

Когда я делаю это, значок просто исчезает из интерфейса, поэтому я погуглил его, и кто-то сказал «сбросить» значок, что бы это ни значило, я попробовал:

ImageIcon newIcon = new ImageIcon("SomePath");
newIcon.getImage().flush();
jLabel1.setIcon(newIcon);

Все еще та же проблема. Значок исчезает.

Что я делаю не так ?


Обновление (полный метод):

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
attempted = myEngine.Attempt('q', word);
if(attempted)
  {
      this.jTextArea1.setText(myEngine.ChangeEncrypt('q', word, this.jTextArea1.getText()));    
  }
  else
  {
      JOptionPane.showMessageDialog(null,"The Letter Q is not in the word", "Error",JOptionPane.WARNING_MESSAGE);
      jButton1.setEnabled(false);
      life ++;
      ImageIcon newIcon = myEngine.UpdatePicture(life);
      newIcon.getImage().flush();
      jLabel1.setIcon(newIcon);
  }

Это метод UpdatePicture:

public ImageIcon UpdatePicture(int life)
{
  ImageIcon emptyIcon = new ImageIcon();
  if (life == 0)
  {
       ImageIcon iconZero = new ImageIcon("/hang0.gif");
       return iconZero;
  }
  if (life == 1)
  {
      ImageIcon iconOne = new ImageIcon("/hang1.gif");
      return iconOne;
  }
  if (life == 2)
  {
      ImageIcon iconTwo = new ImageIcon("/hang2.gif");
      return iconTwo;
  }
  if (life == 3)
  {
      ImageIcon iconThree = new ImageIcon("/hang3.gif");
      return iconThree;
  }
  if (life == 4)
  {
      ImageIcon iconFour = new ImageIcon("/hang4.gif");
      return iconFour;
  }
  if (life == 5)
  {
      ImageIcon iconFive = new ImageIcon("/hang5.gif");
      return iconFive;
  }
  if (life == 6)
  {
      ImageIcon iconSix = new ImageIcon("/hang6.gif");
      return iconSix;
  }

  return emptyIcon;

}

Не уверен, что весь код был необходим, но все же это может помочь.

Переменная жизни начинается с 0.
Я проверил, и в UpdatePicture она достигает "/hang1.gif"; и возвращает ее.


person phadaphunk    schedule 07.11.2012    source источник
comment
Когда вы говорите, что оно исчезает, вы имеете в виду, что оно появляется в какой-то момент, а затем исчезает? Или вообще никогда не появляется? Кроме того, вы можете опубликовать, где вы вызываете этот код?   -  person WilliamShatner    schedule 07.11.2012
comment
Он никогда не появляется. Я имел в виду, что по умолчанию один исчезает, а другой не появляется. Да, я обновлю код   -  person phadaphunk    schedule 07.11.2012
comment
интересно flush() работает в большинстве случаев и требуется для высокой частоты, много периодов перед секундами, вы можете показать любое изображение один раз, не загружать изображения во время выполнения, загружать это как локальную переменную, затем изменить значок (и если sin ' t изменен на вызов flush())   -  person mKorbel    schedule 08.11.2012
comment
Значок AFAIK ImageIcon никогда не возвращает исключения (по умолчанию), должен проверять нулевое значение, можете ли вы проверить нулевое значение, потому что ваш путь (я думаю) неверен   -  person mKorbel    schedule 08.11.2012
comment
Я протестировал и добавил значок в качестве локальной переменной, и он не работает, он остается пустым   -  person phadaphunk    schedule 08.11.2012
comment
@PhaDaPhunk Как говорит mKorbel, я бы проверил путь к файлу, чтобы проверить, является ли он нулевым. Или временно добавьте жесткий путь только для проверки. Если это не проблема, возможно, выполните очистку и сборку проекта. То, что вы пробовали выше, сработает, если это проблема кэширования.   -  person WilliamShatner    schedule 08.11.2012
comment
Чтобы проверить профиль @Gagandeep Bali, он опубликовал несколько очень любезных ответов об упаковке и Icon / ImageICon.   -  person mKorbel    schedule 08.11.2012
comment
Странно, что вам нужно вызвать флеш в таком случае. Вы уверены, что updatePicture(int) не возвращает значение null? Тогда имело бы смысл исчезнуть изображение. Если нет, то уверены ли вы, что вызываете весь код, связанный с SWING, в потоке диспетчеризации событий (EDT)? Это часто может привести к странному непредсказуемому поведению, если вы этого не сделаете, но ваше поведение кажется последовательным, так что, вероятно, это не так. (Примечание к стилю: имена методов должны начинаться со строчной буквы) ОБНОВЛЕНИЕ: Хорошо, побили :)   -  person Bjarke    schedule 08.11.2012
comment
Где именно находится ваше изображение?   -  person flawyte    schedule 08.11.2012
comment
@mKorbel Плохо. Он работает с полным путем. Так что проблема в пути. Как мне это решить? Просто имя файла должно относиться к файлу src нет?   -  person phadaphunk    schedule 08.11.2012
comment
Папка источника @miNde. Со всеми моими .java   -  person phadaphunk    schedule 08.11.2012
comment
@PhaDaPhunk @Gagandeep Bali (не забудьте обновить свои ответы))   -  person mKorbel    schedule 08.11.2012


Ответы (3)


Если файл находится в вашей папке src, то:

ImageIcon ii = new ImageIcon(getClass().getResource("/myFile.gif"));
person flawyte    schedule 07.11.2012
comment
Теперь изображение остается прежним. Таким образом, стандартный остается там, а новый не появляется. - person phadaphunk; 08.11.2012
comment
Вы пытались обновить + очистить свой проект таким образом, чтобы Eclipse обновил дерево файлов? - person flawyte; 08.11.2012
comment
Оооо вау .. Я объединил два ваших ответа, и у меня получилось. Ваше решение без / - person phadaphunk; 08.11.2012
comment
Это был не я. Странно, что это не сработало, потому что сработало в одном из моих проектов! Но ничего, это круто, если ваша проблема решена :) ! - person flawyte; 08.11.2012

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

person gore_obsessed    schedule 07.11.2012
comment
Я просто попробовал оба способа и впервые испытал те же симптомы, что и у вас, и все работало нормально без косой черты :) В любом случае, лучше всего делать так, как предложил @miNde. - person gore_obsessed; 08.11.2012

Я знаю, что это старая ветка вопросов, но у меня было чертовски много времени, чтобы заменить значок на jLabel, когда мое приложение работало. Вот что, наконец, исправило: я создал новую папку в исходном пакете с именем images и поместил туда изображения. В моем фрейме (основной класс) я добавил это ниже метода initComponents:

  private void moreComponents() {
//    get images for initial screen prompts (Skd2_startPanel, loading label1).
// StartPanel is a panel on the Frame that has the loading label on it))
try {
  lcImage= new ImageIcon(ImageIO.read(getClass().getResource("/images/LC.png")));
  clImage= new ImageIcon(ImageIO.read(getClass().getResource("/images/CL.png")));
} catch (IOException ex) {
  Logger.getLogger(Skd2_Frame.class.getName()).log(Level.SEVERE, null, ex);
 }
}

LC и CL.png — это изображения, которые я хочу использовать в качестве значков меток.

В другом классе я добавил следующее, когда хотел изменить значок:

   loadingLabel1.setIcon(lcImage); // or clImage as needed.

Вам понадобится следующий импорт:

import java.util.logging.Logger;
import javax.imageio.ImageIO;

И добавьте эти два объявления сразу после объявлений переменных:

 static ImageIcon lcImage;
 static ImageIcon clImage;

Надеюсь, это поможет кому-то найти ответ в Интернете.

person Phil Longenecker    schedule 20.08.2015