Swing:鼠标事件和工具提示

时间:2017-07-03 10:31:43

标签: java swing tooltip

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

我写了一个小例子来解释我的问题,一个带有3个Jlabels的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事件?

2 个答案:

答案 0 :(得分:0)

将事件分派到具有侦听器的底层组件。

首先,在框架中添加一般级别侦听器。

然后你在标签上添加一个工具提示。工具提示通过向标签添加侦听器来工作。因此,mouseEntered / Exited事件由工具提示侦听器处理。事件未传递给添加到框架的侦听器。

如果您需要其他处理,则还需要将自定义MouseListener添加到标签中。

答案 1 :(得分:-1)

请使用以下代码更新代码部分:

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

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

基本上使用MouseAdapter匿名类而不是使用MouseListener匿名类。我在你的代码中使用了相同的代码并且工作正常。

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