2 MouseListeners в том же месте в многоуровневой панели - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть 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, который демонстрирует проблему ..

  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 Ответ

2 голосов
/ 17 апреля 2019

Звучит так, как будто вы столкнулись с «общей проблемой многоуровневой панели», как говорится на странице документации 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...