在layeredPane

时间:2019-04-17 07:37:11

标签: java swing user-interface

我有一个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。

  1. 主类

        package com.company;
    
        public class Main {
    
            public static void main(String[] args) {
                Frame f = new Frame();
                f.setVisible(true);
            }
        }
    
  2. 框架类

        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();
            }
        }
    
  3. 面板类

        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);
    
            }
        }
    

1 个答案:

答案 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

相关问题