有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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如何知道鼠标按下事件发生的时间?我需要为我自己的逻辑找到答案。代码在哪里写的

when the user press the mouse -- > trigger the method "public void mousePressed(MouseEvent e)" and do what is inside it

谢谢


共 (3) 个答案

  1. # 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();
        }
    }    
    

    鼠标捕捉器:

    用于接收鼠标事件的抽象适配器类。此类中的方法为空。此类的存在是为了方便创建侦听器对象。 鼠标事件允许您跟踪鼠标何时被按下、释放、单击、移动、拖动、何时进入组件、何时退出以及何时移动鼠标滚轮

    扩展该类以创建MouseEvent(包括拖动和运动事件)或/和MouseWheelEvent侦听器,并重写感兴趣的事件的方法。(如果您实现MouseListener、MouseMotionListener接口,您必须定义其中的所有方法。这个抽象类为所有方法定义空方法,因此您只能为您关心的事件定义方法。)

    使用扩展类创建侦听器对象,然后使用组件的addMouseListener addMouseMotionListener、addMouseWheelListener方法将其注册到组件。在以下情况下,将调用侦听器对象中的相关方法,并将MouseEvent或MouseWheelEvent传递给它:

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

    Link

    鼠标听者:

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

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

    Link

    现在,在您阅读本文之后,我认为您将能够对程序进行一些更改,因为当您实现MouseListener接口时,您必须定义其中的所有方法

  2. # 2 楼答案

    实际上有两个与鼠标相关的事件类: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()。然后,当释放按钮时,它将调用mouseRelease()方法,即使此时光标已移出组件。如果在同一点按下和释放按钮,则调用mouseClicked()方法;除了mousePressed()和mouseReleased()之外,还调用了它。如果只是想响应鼠标点击,可能应该在mousePressed()例程中这样做,并将mouseReleased()和mouseClicked()的定义留空

    Source

  3. # 3 楼答案

    每个事件都由一个对象表示,该对象提供有关事件的信息并标识事件源。事件源通常是组件或模型,但其他类型的对象也可以是事件源

    考虑按钮点击事件为我们进一步观察:

    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会检测到单击(您可能不想讨论如何检测单击!)JVM会为您调用所连接的侦听器的actionPerformed()。希望一切都会明朗