сетИкон JLabel не работает, но сетиконимаж JFrame работает

#java #swing #jframe #jlabel #imageicon

#Ява #качать #jframe #jlabel #изображение

Вопрос:

Я использую VS-код, и моя папка содержит только один файл Java и одно изображение.

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

 ImageIcon img = new ImageIcon(getClass().getResource("img_flag.png"));  

Затем я установил это JLabel значение, но на моем экране ничего не появляется.

 JLabel label = new JLabel(img);  

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

 setIconImage(img.getImage());  

Я не могу понять, почему этикетка не может отображать изображение.

Вот мой полный код:

 import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel;  public class Mylable extends JFrame{   Mylable(){    setVisible(true);  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  setSize(500,500);  ImageIcon img = new ImageIcon(getClass().getResource("img_flag.png"));  setIconImage(img.getImage()); //working   JLabel label = new JLabel(img); //not working   add(label);  }   public static void main(String[] args) {  new Mylable();  }  }  

появляется логотип, но JLable не отображается

Комментарии:

1. Компоненты необходимо добавить в рамку ДО того, как она станет видимой.

2. Возьмите setVisible(true); и переместите его в конец конструктора, ИЛИ вам нужно вызвать revalidate и repaint в контейнере, который вы изменили, чтобы запустить новый макет и передать рисунок

3. Спасибо, это сработало. Означает ли это, что я не могу вносить изменения в окно, как только я сделаю его видимым?

4. «это означает, что я не могу вносить изменения в окно, как только я сделаю его видимым» Нет, графический интерфейс может быть обновлен новыми компонентами несколькими способами, но вы хотите быть уверены, что на самом деле необходимо добавлять компоненты динамически, так как это требует специальной обработки. Учитывая JLabel , что без BG цвет, граница, значок или текст невидимы, в этом нет необходимости. Просто добавьте метку при создании графического интерфейса, а затем устанавливайте значок всякий раз, когда это необходимо.

5. Означает ли это, что я не могу вносить изменения в окно, как только я сделаю его видимым? как прокомментировал MadProgrammer: вам нужно вызвать повторную проверку и перекрасить контейнер, который вы изменили, чтобы запустить новый макет и покраску