import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class AppWindow extends Frame {
String keyMessage = "";
String MouseMsg = "";
int mouseX = 10;
int mouseY = 40;
int locX = 0;
int locY = 0;
public AppWindow() {
addMouseListener(new MyMouseAdaptor(this));
}
public void paint(Graphics g) {
g.drawString(keyMessage, mouseX, mouseY);
g.drawString(MouseMsg, locX, locY);
}
public static void main(String[] args) {
AppWindow appWindow = new AppWindow();
appWindow.setSize(400, 400);
appWindow.setVisible(true);
}
}
class MyMouseAdaptor extends MouseAdapter implements MouseListener {
AppWindow appWindow;
public MyMouseAdaptor(AppWindow appWindow) {
this.appWindow = appWindow;
}
public void mousePressed(MouseEvent e) {
this.appWindow.MouseMsg = "Mouse Pressed at : " + e.getX() + ", "
+ e.getY();
this.appWindow.locX = e.getX();
this.appWindow.locY = e.getY();
this.appWindow.repaint();
}
}
亲爱的所有
我有一个奇怪的问题。我知道上面代码中的所有内容但我遗漏了一些东西。 Java如何知道mousePressed事件发生的时间?我需要找到自己逻辑的答案。编写的代码在哪里
when the user press the mouse -- > trigger the method "public void mousePressed(MouseEvent e)" and do what is inside it
由于
答案 0 :(得分:1)
这是注册以查找鼠标事件的代码:
public AppWindow() {
addMouseListener(new MyMouseAdaptor(this));
}
这是扩展MouseAdaptor
并侦听事件的类:
class MyMouseAdaptor extends MouseAdapter implements MouseListener {
AppWindow appWindow;
public MyMouseAdaptor(AppWindow appWindow) {
this.appWindow = appWindow;
}
public void mousePressed(MouseEvent e) {
this.appWindow.MouseMsg = "Mouse Pressed at : " + e.getX() + ", "
+ e.getY();
this.appWindow.locX = e.getX();
this.appWindow.locY = e.getY();
this.appWindow.repaint();
}
}
<强> MouseAdaptor:强>
用于接收鼠标事件的抽象适配器类。此类中的方法为空。此类存在是为了创建侦听器对象的便利。 通过鼠标事件,您可以跟踪鼠标按下,释放,单击,移动,拖动,进入组件,退出时以及移动鼠标滚轮的时间。
扩展此类以创建MouseEvent(包括拖动和运动事件)或/和MouseWheelEvent侦听器,并覆盖感兴趣事件的方法。 (如果实现MouseListener,MouseMotionListener接口,则必须定义其中的所有方法。此抽象类为它们定义了所有的null方法,因此您只需要为您关心的事件定义方法。)
使用扩展类创建一个侦听器对象,然后使用组件的addMouseListener addMouseMotionListener,addMouseWheelListener方法将其注册到组件。调用侦听器对象中的相关方法,并在以下情况下将MouseEvent或MouseWheelEvent传递给它:
<强>的MouseListener:强>
用于在组件上接收“有趣”鼠标事件(按下,释放,单击,输入和退出)的侦听器界面。 (要跟踪鼠标移动和鼠标拖动,请使用MouseMotionListener。) 对处理鼠标事件感兴趣的类要么实现此接口(及其包含的所有方法),要么扩展抽象的MouseAdapter类(仅覆盖感兴趣的方法)。
然后使用组件的addMouseListener方法向该组件注册从该类创建的侦听器对象。按下鼠标,释放单击(按下并释放)时会生成鼠标事件。当鼠标光标进入或离开组件时,也会生成鼠标事件。发生鼠标事件时,将调用侦听器对象中的相关方法,并将MouseEvent传递给它。
现在看完之后,我想你可以对程序进行一些更改,因为当你实现MouseListener
接口时,你必须定义其中的所有方法。
答案 1 :(得分:1)
每个事件都由一个对象表示,该对象提供有关事件的信息并标识事件源。事件源通常是组件或模型,但其他类型的对象也可以是事件源。
考虑按钮点击事件以进一步观察:
button.addActionListener(this);
此语句将事件添加到侦听器列表中,当JVM收到事件(在这种情况下单击)时,它会在列表中的所有侦听器上调用相应的方法。
这是怎么发生的?好吧,我认为你应该阅读java中的Callback
机制。
您还可以使用回调机制创建自己的侦听器。请考虑以下代码:
代码用于信用卡应用模拟。在下面的代码中,调用pinChanged()
方法时会自动调用changePin()
方法。
public interface PinChangeListener {
public void pinChanged();
}
public CreditCard {
public PinChangeListener pinChangeListener;
private int pin;
public changePin(int pin) {
this.pin = pin;
if (pinChangeListener != null) {
pinChangeListener.pinChanged();
}
}
}
要将回调/侦听器连接到信用卡,您只需实施PinChangeListener
方法:
creditCard.pinChangeListener = new PinChangeListener() {
public void pinChanged() {
System.out.println("The pin has been changed");
}
};
同样,当你将一个监听器附加到一个按钮时,JVM会检测到这个点击,(你可能不想进入检测到点击的方式!)和那个监听器的actionPerformed()
。附件由JVM为您调用。希望这清楚。
答案 2 :(得分:-1)
实际上有两个与鼠标相关的事件类:MouseEvent和MouseMotionEvent。还有两个侦听器接口,MouseListener和MouseMotionListener。 MouseListener接口声明方法
public void mousePressed(MouseEvent evt);
public void mouseReleased(MouseEvent evt);
public void mouseClicked(MouseEvent evt);
public void mouseEntered(MouseEvent evt);
public void mouseExited(MouseEvent evt);
并且MouseMotionListener声明
public void mouseMoved(MouseEvent evt);
public void mouseDragged(MouseEvent evt);
任何组件都可以生成鼠标事件。想要响应这些事件的对象必须实现一个或两个侦听器接口。它还必须通过调用组件的addMouseListener()和/或addMouseMotionListener()方法向组件注册自己。请注意,实现MouseListener的对象必须为该接口中的所有五个方法提供定义,即使定义仅包含一组空括号。类似地,实现MouseMotionListener的对象必须同时定义mouseMoved()和mouseDragged()方法。
当鼠标光标位于该组件上方时,只要按下鼠标上的一个按钮,组件就会调用mousePressed()。然后,当释放按钮时,它将调用mouseReleased()方法 - 即使光标在此时移动到组件之外。如果在同一点按下并释放按钮,则调用mouseClicked()方法;除了mousePressed()和mouseReleased()之外,还调用它。如果您只是想响应鼠标点击,您应该在mousePressed()例程中执行此操作,并将mouseReleased()和mouseClicked()的定义保留为空。