【问题标题】:Swing: Mouse events and tooltipSwing:鼠标事件和工具提示
【发布时间】:2017-07-03 10:31:43
【问题描述】:

我正在开发一个带有标签工具提示的小型 Swing 应用程序。此应用必须对鼠标事件做出反应,例如单击或退出框架。
没有工具提示,应用程序的行为正确,但如果我添加工具提示,我就没有鼠标事件了。

我写了一个小例子来解释我的问题,一个带有 3 个 Jlabel 的 JFrame。中间的有一个工具提示:

package testJtooltip;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.border.Border;

public class TestToolTip {
    public static void main(String[] args){
        JFrame frame = new JFrame();
        frame.setSize(new Dimension(100,150));
        frame.setLocation(100, 100);
        frame.setUndecorated(true);
        frame.addMouseListener (
                new MouseListener () {
                    public void mouseClicked(MouseEvent e) {}
                    public void mouseEntered(MouseEvent e) {}
                    public void mouseExited(MouseEvent e) {
                        System.out.println("exited");
                    }
                    public void mousePressed(MouseEvent e) {
                        System.exit(0);
                    }
                    public void mouseReleased(MouseEvent arg0) {}
                }
                );


        Border border = BorderFactory.createLineBorder(Color.BLUE, 1);

        JLabel label1 = new JLabel();
        label1.setBorder(border);
        label1.setText("top");
        label1.setPreferredSize(new Dimension(100, 50));
        frame.add(label1,BorderLayout.PAGE_START);

        JLabel label2 = new JLabel();
        label2.setBorder(border);
        label2.setText("center");
        label2.setPreferredSize(new Dimension(100, 50));
        label2.setToolTipText("tooltip");
        frame.add(label2,BorderLayout.CENTER);

        JLabel label3 = new JLabel();
        label3.setBorder(border);
        label3.setText("bottom");
        label3.setPreferredSize(new Dimension(100, 50));
        frame.add(label3,BorderLayout.PAGE_END);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

所以,我的问题是:
1) 点击中心标签不退出(点击其他标签退出)。
2) 在中心标签级别向左或向右退出框架时不会触发 mouseExited(而在其他地方触发事件时)。
3) 从顶部或底部标签移动到中心时会触发 mouseExited 事件。

带有工具提示的 JLabel“似乎”在框架“外部”。

我错过了什么?我该如何修复它,特别是 mouseExited 事件?

【问题讨论】:

  • 我相信这就是你要找的东西:Tooltip stealing mouse events
  • 感谢您的回复,但不,即使我在工具提示出现之前单击或离开工具提示(但在中心标签内),应用程序也不会退出。更何况,这也解决不了mousExited事件问题……
  • 搜索并找到了确切的解决方案。参考这里:stackoverflow.com/questions/14931323/…

标签: java swing tooltip


【解决方案1】:

事件被分派到具有监听器的底层组件。

首先,向框架添加一个通用级别侦听器。

但随后您向标签添加了工具提示。工具提示通过向标签添加侦听器来工作。因此 mouseEntered/Exited 事件由工具提示侦听器处理。该事件不会传递给添加到框架中的侦听器。

如果您想要额外的处理,那么您还需要将您的自定义 MouseListener 添加到标签中。

【讨论】:

  • 它部分解决了问题。我可以在 JLabel 级别处理 mousePressed,它可以工作。但是关于mouseExited,它不起作用:我现在在离开JFrame(好的)时有mouseExited,而且从3个JLabel中的任何一个移动到另一个时也有mouseExited。那不行……
  • @Carminou,我不完全理解您的要求,因此您可以根据您对事件处理方式的新理解来实施逻辑。而不是在标签级别处理 mouseEntered/Exited,也许您可​​以创建一个“包装器”面板。因此,您将标签添加到“包装器”面板并在“包装器”面板上处理 mouseEntered/Exited。也许这个答案会给你一些想法:stackoverflow.com/questions/42579137/…
  • 实际上,我的应用程序要复杂得多,并且在封闭窗口的一侧有很多带有工具提示的 JLabel。当光标移出窗口时,显示器应进入“待机”状态(假设为灰色)。因此,我在外部名称级别编写了 mouseExited 处理程序,以在光标离开窗口时将显示重置为标准。但是如上所示,当光标通过具有工具提示的 JLabel 之一离开窗口时,当光标离开窗口时,JFrame 不会收到 mouseExited 事件。
【解决方案2】:

请使用以下给定代码更新您的代码部分:

frame.addMouseListener(new MouseAdapter() {
    public void mouseExited(MouseEvent e) {
        System.out.println("exited");
    }

    public void mousePressed(MouseEvent e) {
        System.exit(0);
    }
});

基本上使用 MouseAdapter 匿名类,而不是使用 MouseListener 匿名类。我对您的代码使用了相同的代码,并且运行良好。

希望这会有所帮助。 :-)

【讨论】:

  • 对不起,我做了修改(MouseAdapted 而不是 MouseListener),但它没有解决任何问题。仍然是错误的 mouseExited 事件,并且中心按钮上没有 mousePressed 事件。
  • 搜索并找到了确切的解决方案。参考这里:stackoverflow.com/questions/14931323/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
相关资源
最近更新 更多