JLabel ToolTip会干扰MouseListener

编程入门 行业动态 更新时间:2024-10-26 16:27:52
本文介绍了JLabel ToolTip会干扰MouseListener的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我有Java Swing应用程序ToolTipMouseTest

I have Java Swing application ToolTipMouseTest

临界线是label.setToolTipText("label" + i);.一旦将其注释掉,只需在控制台上单击标签即可生成2 mousePressed.启用此行后,单击标签将不会产生任何结果.

The critical line is label.setToolTipText("label" + i);. Once it is commented out very click on a label produces 2 mousePressed in console. With this line enabled click on labels would produce nothing.

这是预期的行为还是错误?我的目标是在不禁用MouseListener的情况下显示工具提示.

Is this expected behaviour or a bug? My goal is to show tooltips without disabling MouseListener from working.

几乎是SSCCE,但没有导入:

Almost SSCCE, but without imports:

public class ToolTipMouseTest { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new ToolTipMouseTest(); } }); } public ToolTipMouseTest() { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); JLayeredPane lpane = new JLayeredPane() { @Override public Dimension getPreferredSize() { return new Dimension(600,400); } }; MouseAdapter1 mouseAdapter1 = new MouseAdapter1(); lpane.addMouseListener(mouseAdapter1); frame.add(lpane); JPanel panel1 = new JPanel(); panel1.setSize(new Dimension(600, 400)); panel1.setOpaque(false); lpane.add(panel1, JLayeredPane.PALETTE_LAYER); JPanel panel2 = new JPanel(); for (int i = 0; i < 5; i++) { JLabel label = new JLabel("Label " + i); panel2.add(label); label.setToolTipText("label" + i); //HERE!! } JScrollPane spane = new JScrollPane(panel2) { private static final long serialVersionUID = 1L; @Override public Dimension getPreferredSize() { return new Dimension(300, 200); } }; MouseAdapter2 mouseAdapter2 = new MouseAdapter2(); spane.addMouseListener(mouseAdapter2); panel1.add(spane); frame.pack(); frame.setVisible(true); } private class MouseAdapter1 extends MouseAdapter { @Override public void mousePressed (MouseEvent me) { System.out.println("1 mousePressed"); } } private class MouseAdapter2 extends MouseAdapter { @Override public void mousePressed (MouseEvent me) { System.out.println("2 mousePressed"); } } }

推荐答案

它正在按预期工作.让我解释一下原因.

It is working as intended. Let me explain why.

将工具提示添加到任何组件(您的情况下为标签)时,它们会自动从ToolTipManager接收新的鼠标侦听器.这是ToolTipManager类的注册方法:

When you are adding a tooltip to any component (labels in your case) they automatically recieve a new mouse listeners from ToolTipManager. Here is the register method from ToolTipManager class:

public void registerComponent(JComponent component) { component.removeMouseListener(this); component.addMouseListener(this); component.removeMouseMotionListener(moveBeforeEnterListener); component.addMouseMotionListener(moveBeforeEnterListener); component.removeKeyListener(accessibilityKeyListener); component.addKeyListener(accessibilityKeyListener); }

任何组件上至少设置了一个鼠标侦听器时-它会阻止任何鼠标进入/退出/单击/按下/释放事件(如果设置了鼠标移动侦听器,则将鼠标拖动/移动) )从组件层次结构中删除.

When any component has atleast one mouse listener set on it - it will block any mouse enter/exit/click/press/release events (mouse dragged/moved in case there is mouse motion listener set) from going down in the components hierarchy.

在您的情况下-由于设置了工具提示时安装了ToolTipManager侦听器,因此标签阻止了鼠标事件和鼠标运动事件进入分层窗格.

In your case - labels blocking mouse events and mouse motion events from going down to layered pane due to ToolTipManager listeners installed when tooltip is set.

如果您使用变通方法侦听器将事件向下传递,则可以避免这种情况.例如,您可以使用工具提示将该侦听器添加到每个组件,这些提示应向下传递鼠标事件.

This could be avoided if you make a workaround listener with that will pass events down. For example you can add that listener to every component with a tooltip that should pass mouse events down.

这是一个如何完成此操作的小例子:

Here is a small example of how that could be done:

label.addMouseListener ( new MouseAdapter () { public void mousePressed ( MouseEvent e ) { lpane.dispatchEvent ( SwingUtilities.convertMouseEvent ( e.getComponent (), e, lpane ) ); } } );

在这种情况下,事件将传递到分层窗格.无论如何,您甚至可以将它分发到您想要的任何地方(我想您的情况是spane).

In that case event will be passed to layered pane though. Anyway you can dispatch this even anywhere you want (i guess it would be spane in your case).

更多推荐

JLabel ToolTip会干扰MouseListener

本文发布于:2023-10-08 02:28:29,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1471248.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:干扰   JLabel   ToolTip   MouseListener

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!