java - 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..
主班
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); } }
解决方案
正如 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
推荐阅读
- sql - ALTER TABLE 语句与 FOREIGN KEY 约束冲突
- angular - 主题值更改时未触发订阅
- python - 如何将字符串的ndarray列表转换为浮点数
- google-chrome-extension - 在后台服务人员中加载本地化文本/获取浏览器语言 - Chrome 扩展清单 v3
- reactjs - 多和异步中的 DefaultValue 不起作用
- java - Graphics2D 中的叠加图像
- java - api以文本形式返回pdf如何将其保存为pdf?
- javascript - ReactJS 从 onClick() 事件更改 div 的内容
- c# - C# VSTO Word Addin,需要打开一个文档
- android - https 文件无法在 iOS 上使用“AVPlayerItem.Status.failed”播放