Обновление JLabel - Java - PullRequest
       8

Обновление JLabel - Java

0 голосов
/ 12 мая 2018

У меня есть некоторые проблемы с JLabels и Frames ..

У меня есть следующий код:

 list.addListSelectionListener(
            new ListSelectionListener() {

                @Override
                public void valueChanged(ListSelectionEvent e) {
                    //System.out.println(e.getFirstIndex());


                    String selectedFile = list.getSelectedValue().toString();
                    System.out.println("Selected file " + selectedFile);
                    JLabel label;
                    ImageIcon icon = new ImageIcon("C:\\Users\\danie\\Pictures\\" + selectedFile);
                    // frame.setSize(1047, 680);
                     label = new JLabel(icon);
                     //label.setSize(100,100);
                     frame.getContentPane().add(label, BorderLayout.CENTER);
                     frame.revalidate();
                     frame.repaint();

                }

    });

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

Может ли кто-нибудь мне помочь? :)

Ответы [ 3 ]

0 голосов
/ 12 мая 2018

Сначала вы создаете новый экземпляр JLabel вместо того, чтобы работать с существующим. Что вы на самом деле хотите сделать, это:

labe.setIcon(icon);

Это автоматически обновит элемент.

0 голосов
/ 12 мая 2018

Предложения:

  1. Не создавайте новый JLabel, дайте ему ImageIcon и ожидайте, что существующий JLabel изменится.Два JLabels, исходный и созданный здесь, являются двумя совершенно разными объектами, и изменение состояния одного (отображаемого значка) волшебным образом не изменит состояния другого.
  2. Убедитесь, чточто исходный JLabel имеет переменную экземпляра в классе (не в вашем классе слушателя), поле, ссылку на него, а затем в коде слушателя измените значок, отображаемый в , что JLabel, вызвав его setIcon(...) method
  3. Нет необходимости вызывать revalidate() или repaint() здесь, как это должно быть сделано, если вы изменяете компоненты, содержащиеся в контейнере, например, если вы удалили оригинальный JLabel из contentPane JFrame и поменяли местами вновенький.Обратите внимание, что я не рекомендую вам сделать это, так как это слишком усложняет то, что должно быть простым делом - замена значков.
  4. Чтобы упростить задачу, я предлагаю вам прочитать все ваши изображения при запуске программы, создать ImageIcons в то время, а затем поместить их в массив или коллекцию (например, ArrayList<Icon> или HashMap<String, Icon>).), а затем в своем коде слушателя извлеките правильный значок и поместите его в существующую JLabel.
0 голосов
/ 12 мая 2018

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

...