我有一个JLayeredPane'lp',其中包含一个带有JLabel'l'的JPanel'p'。
如果单击了标签,则我打印出消息“ label1被单击”,然后在“ p”顶部的JLayeredPane“ lp”中添加另一个JPanel“ p2”,在“ p2”上另一个JLabel说“ l2 '。
如果单击标签“ l2”,则应打印出“单击了label2”。
标签l1和l2在LayeredPane上彼此重叠。在运行时,单击l时,将显示“ p2”和“ l2”,但是此后如果单击“ l2”,则不会说“单击了label2”。取而代之的是,它只会说“ label1被点击”,并会继续添加越来越多的面板。
这是演示问题的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);
}
}
答案 0 :(得分:2)
像Oracle文档页面所说的那样,您遇到的声音遇到了“常见的分层窗格问题”。因此,请使用整数而不是整数:
layeredPane.add(panel2, new Integer(2));
和
layeredPane.add(panel1, new Integer(1));
https://docs.oracle.com/javase/tutorial/uiswing/components/problems.html#layeredpane