我正在开发一个带有标签提示的小型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事件?
最佳答案
事件被调度到具有侦听器的最底层组件。
首先,将通用级别的侦听器添加到框架。
但是,然后在标签上添加工具提示。工具提示通过向标签添加侦听器而起作用。因此,mouseEntered / Exited事件由工具提示侦听器处理。该事件不会传递给添加到框架的侦听器。
如果要进行其他处理,则还需要将自定义MouseListener添加到标签。
关于java - 摆动:鼠标事件和工具提示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44883357/