java知道mousePressed()事件何时发生?

时间:2014-09-28 04:39:22

标签: java events mouseevent frame

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

由于

3 个答案:

答案 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传递给它:

  • 按下,释放或单击(按下并释放)鼠标按钮时
  • 当鼠标光标进入或退出组件时
  • 当鼠标滚轮旋转,或鼠标移动或拖动时

Link

<强>的MouseListener:

用于在组件上接收“有趣”鼠标事件(按下,释放,单击,输入和退出)的侦听器界面。 (要跟踪鼠标移动和鼠标拖动,请使用MouseMotionListener。) 对处理鼠标事件感兴趣的类要么实现此接口(及其包含的所有方法),要么扩展抽象的MouseAdapter类(仅覆盖感兴趣的方法)。

然后使用组件的addMouseListener方法向该组件注册从该类创建的侦听器对象。按下鼠标,释放单击(按下并释放)时会生成鼠标事件。当鼠标光标进入或离开组件时,也会生成鼠标事件。发生鼠标事件时,将调用侦听器对象中的相关方法,并将MouseEvent传递给它。

Link

现在看完之后,我想你可以对程序进行一些更改,因为当你实现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()的定义保留为空。

Source