2014-09-28 44 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爲您調用。希望這個清除。

相關問題