以下问题基于以下信息。向下滚动以查看实际问题 - 它特指控制台输出。
我已经删除了所有内容,并提供了一个简单的程序来重现下面的输出:
import java.awt.AWTEvent;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;
import javax.swing.JFrame;
public class Main {
static Toolkit tk = Toolkit.getDefaultToolkit();
static long eventMask = AWTEvent.MOUSE_MOTION_EVENT_MASK + AWTEvent.MOUSE_EVENT_MASK
+ AWTEvent.KEY_EVENT_MASK;
public static void main(String[] args) {
tk.addAWTEventListener(new AWTEventListener() {
@Override
public void eventDispatched(AWTEvent e) {
System.out.println(e.getID() + ", " + e);
}
}, eventMask);
JFrame test = new JFrame();
test.setBounds(0, 0, 100, 100);
test.setVisible(true);
}
}
您将看到它在控制台中提供以下输出:
500, java.awt.event.MouseEvent[MOUSE_CLICKED,(71,54),absolute(71,54),button=1,modifiers=Button1,clickCount=1] on frame0
501, java.awt.event.MouseEvent[MOUSE_PRESSED,(71,54),absolute(71,54),button=1,modifiers=Button1,extModifiers=Button1,clickCount=1] on frame0
506, java.awt.event.MouseEvent[MOUSE_DRAGGED,(70,54),absolute(70,54),modifiers=Button1,extModifiers=Button1,clickCount=0] on frame0
502, java.awt.event.MouseEvent[MOUSE_RELEASED,(67,54),absolute(67,54),button=1,modifiers=Button1,clickCount=1] on frame0
503, java.awt.event.MouseEvent[MOUSE_MOVED,(67,55),absolute(67,55),clickCount=0] on frame0
503, java.awt.event.MouseEvent[MOUSE_MOVED,(65,91),absolute(65,91),clickCount=0] on frame0
505, java.awt.event.MouseEvent[MOUSE_EXITED,(65,92),absolute(65,92),button=0,clickCount=0] on frame0
我的问题是 - 如何在此
中访问各个实体[MOUSE_RELEASED,(67,54)的,绝对的(67,54),按钮= 1,改性剂= Button1的,的clickCount = 1]
没有解析数据?
在我的情况下我需要全局事件监听器。我之前从未使用过它们,所以我确信它是我忽略的东西。相关问题(产生于此的所有内容),Java check mouse button state
答案 0 :(得分:6)
只需检查e instanceof MouseEvent并从MouseEvent获取所有参数
public void eventDispatched(AWTEvent e) {
if (e instanceof MouseEvent) {
MouseEvent me=(MouseEvent)e;
}
}
long KEY_EVENTS = AWTEvent.KEY_EVENT_MASK;
long MOUSE_EVENTS = AWTEvent.MOUSE_EVENT_MASK;
long MOUSE_MOTION_EVENTS = AWTEvent.MOUSE_MOTION_EVENT_MASK;
答案 1 :(得分:4)
@StanislavL提供正确建议的代码
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class ClosingFrame extends JFrame {
private static final long serialVersionUID = 1L;
private AWTEventListener awt;
public ClosingFrame() {
setName("Dialog ... ClosingFrame");
JButton b = new JButton("<html>close dialog. <br>enter this button from <br>"
+ "the top to get the <br>hoverhelp close enough<br>to cause problems<html>");
b.setName("buttonToPress");
b.setToolTipText("<html>111111111111111111111"
+ "1111111111111111111111111111111111111111111<br></html>");
b.addActionListener(closeActionListener);
add(b);
JPopupMenu menu = new JPopupMenu();
menu.add("some item ...........");
menu.add("another one ..........");
b.setComponentPopupMenu(menu);
pack();
setVisible(true);
}
private AWTEventListener createAWTWindowListener() {
AWTEventListener awt1 = new AWTEventListener() {
@Override
public void eventDispatched(AWTEvent e) {
if (MouseEvent.MOUSE_EXITED == e.getID()) {
MouseEvent event = (MouseEvent) e;
String name = event.getComponent().getName();
System.out.println("got mouseExited: " + name);
awtMouseExited(event);
}
}
};
return awt1;
}
private void awtMouseExited(MouseEvent event) {
Point point = SwingUtilities.convertPoint(event.getComponent(), event.getPoint(), this);
if (!getBounds().contains(point)) {
// if (!getRootPane().getVisibleRect().contains(point)) {
dispose();
}
}
private void installHoverListeners() {
if (awt != null) {
return;
}
awt = createAWTWindowListener();
Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK);
}
private void uninstallHoverListeners() {
if (awt == null) {
return;
}
Toolkit.getDefaultToolkit().removeAWTEventListener(awt);
awt = null;
}
@Override
public void addNotify() {
super.addNotify();
installHoverListeners();
}
@Override
public void removeNotify() {
uninstallHoverListeners();
super.removeNotify();
}
private ActionListener closeActionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
dispose();
}
};
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ClosingFrame closingFrame = new ClosingFrame();
}
});
}
}