Java - JLabel теряет изображение, а новое появляется спереди

У меня есть большой JLabel с изображением, где я хотел бы, чтобы, как только пользователь наведет на него мышь, он потерял свое изображение, а в нем появились другие маленькие картинки, близкие друг к другу. Как генеалогическое древо, где основным изображением является дерево, а при вводе мыши рядом друг с другом появляются маленькие картинки плебса, как на картинке ниже. Я использую:

JLabel c = new JLabel();
c.setBorder(new EtchedBorder(EtchedBorder.RAISED));
c.setIcon(new ImageIcon("C:\\Users\\Lud\\Desktop\\family\\tree.png"));
c.setBackground(new Color(192, 192, 192));
c.setOpaque(true);
c.setBounds(5, 5, 256, 256);

    c.addMouseListener(new MouseAdapter() {
        public void mouseEntered(MouseEvent me) {
            c.setIcon(null);
            JLabel c1 = new JLabel();
            c1.setIcon(new ImageIcon("C:\\Users\\Lud\\Desktop\\family\\george.png"));
            c1.setBounds(10, 10, 32, 32);
            add(c1);
        }
        public void mouseExited(MouseEvent me) {

        }
    });
    add(c);

Основное изображение JLabel/дерева выглядит просто отлично, но когда я навожу на него мышь, оно просто теряет свои изображения, не отображая новый над ним. Что я делаю неправильно? Спасибо

введите здесь описание изображения


person darkchampionz    schedule 27.10.2015    source источник
comment
Я согласен с HovercraftFullOfEels, но если вы все еще хотите делать то же самое, вы можете добавить c.setVisible(false); вместо c.setIcon(null); перед созданием новой этикетки. JLabel c1 = новый JLabel();   -  person Earthx9    schedule 27.10.2015
comment
Новый jlabel по-прежнему не виден :|   -  person darkchampionz    schedule 27.10.2015
comment
Вы пытались добавить 'c1.setVisible(true);' после JLabel c1 = new JLabel(); c1.setIcon(new ImageIcon(C:\\Users\\Lud\\Desktop\\family\\george.png)); c1.setBounds(10, 10, 32, 32);   -  person Earthx9    schedule 27.10.2015
comment
Да, я сделал его видимым, прежде чем добавить. Теперь работает нормально, хотя мне нужно будет пересмотреть свой код после того, что было предложено здесь. Спасибо за вашу помощь   -  person darkchampionz    schedule 27.10.2015
comment
Пожалуйста. Хорошо, если это помогло вам.   -  person Earthx9    schedule 27.10.2015


Ответы (1)


Не создавайте новый JLabel, а просто установите значок на существующем JLabel.

В качестве дополнительной рекомендации, пожалуйста, поймите, что, хотя нулевые макеты и setBounds() могут показаться новичкам Swing самым простым и лучшим способом создания сложных графических интерфейсов, чем больше графических интерфейсов Swing вы создаете, тем более серьезные трудности вы столкнетесь при их использовании. Они не будут изменять размер ваших компонентов при изменении размера графического интерфейса, они идеально подходят для улучшения или поддержки, они полностью терпят неудачу при размещении в области прокрутки, они выглядят ужасно ужасно при просмотре на всех платформах или разрешениях экрана, которые отличаются от исходного. .

person Hovercraft Full Of Eels    schedule 27.10.2015
comment
Да, но я бы хотел, чтобы пользователи могли реагировать на новые JLabels, например, наводить курсор на одну картинку и отображать возраст людей и т. д. - person darkchampionz; 27.10.2015
comment
@darkchampionz: вы все еще можете сделать это с оригинальным JLabel! - person Hovercraft Full Of Eels; 27.10.2015