У меня есть JLayeredPane 'lp', который содержит JPanel 'p' с JLabel 'l' на нем.
Если щелкнуть ярлык, я распечатаю сообщение 'label1 clicked', а затемдобавьте еще одну JPanel 'p2' к JLayeredPane 'lp' поверх 'p', с другим JLabel на 'p2', скажем 'l2'.
Если щелкнуть метку 'l2', она должна распечатать 'нажата метка2 '.
Метки l1 и l2 перекрывают друг друга на панели LayeredPane.При запуске, когда по l нажимают, он отображает «p2» с «l2», но после этого, если «l2» нажимается, он не говорит «label2 был нажат».Вместо этого он просто продолжает говорить «нажал ярлык1» и продолжает добавлять все больше и больше панелей.
Вот MCVE, который демонстрирует проблему ..
Основной класс
package com.company;
public class Main {
public static void main(String[] args) {
Frame f = new Frame();
f.setVisible(true);
}
}
Класс каркаса
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class Frame extends JFrame {
MouseAdapter listener;
public Frame()
{
super.setSize(600,600);
super.setLayout(new BorderLayout());
JLayeredPane layeredPane = new JLayeredPane();
layeredPane.setSize(600, 600);
listener = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Label1 was clicked");
JPanel panel2 = new JPanel();
panel2.setBackground(Color.RED);
panel2.setBounds(270,0,60,60);
JLabel label2 = new JLabel("LABEL 2");
label2.setBounds(0,0,60,60);
panel2.add(label2);
layeredPane.add(panel2, 2);
label2.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Label 2 was clicked.");
}
});
}
};
JPanel panel1 = new Panel(layeredPane);
JLabel label1 = new JLabel("LABEL 1");
label1.setBounds(0,0,60,60);
panel1.add(label1);
label1.addMouseListener(listener);
layeredPane.add(panel1, 1);
super.add(layeredPane);
super.validate();
}
}
Класс панели
package com.company;
import javax.swing.*;
import java.awt.*;
public class Panel extends JPanel {
JLayeredPane layeredPane;
public Panel(JLayeredPane layeredPane) {
this.layeredPane = layeredPane;
super.setSize(600,600);
super.setBackground(Color.BLUE);
}
}