2014-09-28 46 views
0
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()事件何时发生?

我有一个奇怪的问题。我知道上述代码中的所有内容,但我错过了一些东西。 Java如何知道mousePressed事件何时发生?我需要为自己的逻辑找到答案。在哪里写的代码,说

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

感谢

回答

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接口,则必须定义其中的所有方法,该抽象类为它们全部定义了空方法,因此您只需要为您关心的事件定义方法。)

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

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

Link

MouseListener:

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

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

Link

现在您已经阅读这之后,我想你可以,因为当你实现MouseListener接口,你必须定义所有的在它的方法来进行一些修改程序..

+0

亲爱的。谢谢你的答案..我知道你提到的所有..我的问题是..如何知道java何时按下的方法,因为有一个代码,内置在Java中说(当用户按下鼠标 - >触发方法“public void mousePressed(MouseEvent e)”并做它里面的东西)..请考虑一下.. – 2014-09-28 05:07:48

+0

正如我在回答中写的,MouseAdaptor是一个抽象类,用于创建侦听器对象它侦听任何鼠标事件,并且一旦该事件发生,就会调用相应的方法,并将鼠标事件传递给它。接口MouseListener也一样。 – 2014-09-28 05:15:26

+0

我认为EventListener是编写代码的地方,它允许Java监听事件并调用相应的方法,因为所有事件监听器都会扩展EventListener。 – 2014-09-28 05:19:35

-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

+0

人们还可以使用MouseAdaptor如上面的例子...... – 2014-09-28 04:59:58

+0

亲爱使用。谢谢你的答案..我知道你提到的所有..我的问题是..如何知道java何时按下的方法,因为有一个代码,内置在Java中说(当用户按下鼠标 - >触发方法“public void mousePressed(MouseEvent e)”,并做它里面的东西)..请考虑一下.. – 2014-09-28 05:08:52

+0

兄弟,如果你在JVM和JRE内部挖掘,然后帮助自己。因为有数百个不同的供应商谁发展自己的内部逻辑。 :) – Apurv 2014-09-28 05:26:34

1

每个事件通过一个对象,它给出了关于该事件的信息,并标识所述事件源表示。事件源通常是组件或模型,但其他类型的对象也可以是事件源。

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

button.addActionListener(this); 

这种说法,该事件被添加到听众的名单,而当JVM接收到事件(请在这种情况下),它调用列表中所有侦听器的适当方法。

这是怎么发生的?那么,我认为你应该阅读关于在java中的Callback机制。

您也可以使用回叫机制创建您自己的侦听器。请考虑以下代码:

该代码用于信用卡应用程序模拟。在下面的代码中,当调用changePin()方法时,将自动调用pinChanged()方法。

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为您调用。希望这个清除。

相关问题