首页 > 解决方案 > layeredPane 中同一位置的 2 个 MouseListener

问题描述

我有一个 JLayeredPane 'lp',其中包含一个 JPanel 'p',上面有一个 JLabel 'l'。

如果点击了标签,那么我打印出消息“label1 was clicked”,然后将另一个 JPanel“p2”添加到“p”顶部的 JLayeredPane“lp”中,“p2”上的另一个 JLabel 说“l2”。

如果单击了标签“l2”,则应打印出“单击了标签2”。

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

标签: javaswinguser-interface

解决方案


正如 Oracle 文档页面所说,听起来您遇到了“常见的分层窗格问题”。所以使用 Integer 而不是 int:

layeredPane.add(panel2, new Integer(2));

layeredPane.add(panel1, new Integer(1));

https://docs.oracle.com/javase/tutorial/uiswing/components/problems.html#layeredpane


推荐阅读