簡體   English   中英

Java中的鼠標偵聽器

[英]The mouse listener in Java

在應用程序啟動期間,將在JButton上注冊MouseListener ,然后在啟動任何鼠標單擊該按鈕后,將調用相應的mouseClicked(MouseEvent e)方法。

問題是由誰/誰負責創建具有所有元數據的MouseEvent對象並調用mouseClicked方法。

發布SSCCE:

public class TestMouseListener {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            createAndShowGui();  
        }); 
    }

    private void createAndShowGui(){
        JFrame frame = new JFrame(); 
        JButton button = new JButton(); 
        frame.add(button); 
        button.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) { 
                System.out.println("The button was clicked");   
                System.out.println("The clicked time is":e.getWhen());  
            } 
        }); 
    } 
}

看一下Component類的源代碼。 您可以通過右鍵單擊JButton類並轉到“顯示聲明”來從eclipse中進行操作,或者可以查看JDK隨附的src.zip。 您也許還可以在grepcode上找到它。

Component類具有以下processMouseEvent()函數:

protected void processMouseEvent(MouseEvent e) {
    MouseListener listener = mouseListener;
    if (listener != null) {
        int id = e.getID();
        switch(id) {
          case MouseEvent.MOUSE_PRESSED:
              listener.mousePressed(e);
              break;
          case MouseEvent.MOUSE_RELEASED:
              listener.mouseReleased(e);
              break;
          case MouseEvent.MOUSE_CLICKED:
              listener.mouseClicked(e);
              break;
          case MouseEvent.MOUSE_EXITED:
              listener.mouseExited(e);
              break;
          case MouseEvent.MOUSE_ENTERED:
              listener.mouseEntered(e);
              break;
        }
    }
}

這是對您問題的簡短回答。 此函數稱為mousePressed()函數。 但是我們可以更深入...

processEvent()函數調用processMouseEvent() processEvent()函數:

protected void processEvent(AWTEvent e) {
        if (e instanceof FocusEvent) {
            processFocusEvent((FocusEvent)e);

        } else if (e instanceof MouseEvent) {
            switch(e.getID()) {
              case MouseEvent.MOUSE_PRESSED:
              case MouseEvent.MOUSE_RELEASED:
              case MouseEvent.MOUSE_CLICKED:
              case MouseEvent.MOUSE_ENTERED:
              case MouseEvent.MOUSE_EXITED:
                  processMouseEvent((MouseEvent)e);
                  break;
              case MouseEvent.MOUSE_MOVED:
              case MouseEvent.MOUSE_DRAGGED:
                  processMouseMotionEvent((MouseEvent)e);
                  break;
              case MouseEvent.MOUSE_WHEEL:
                  processMouseWheelEvent((MouseWheelEvent)e);
                  break;
            }

        } else if (e instanceof KeyEvent) {
            processKeyEvent((KeyEvent)e);

        } else if (e instanceof ComponentEvent) {
            processComponentEvent((ComponentEvent)e);
        } else if (e instanceof InputMethodEvent) {
            processInputMethodEvent((InputMethodEvent)e);
        } else if (e instanceof HierarchyEvent) {
            switch (e.getID()) {
              case HierarchyEvent.HIERARCHY_CHANGED:
                  processHierarchyEvent((HierarchyEvent)e);
                  break;
              case HierarchyEvent.ANCESTOR_MOVED:
              case HierarchyEvent.ANCESTOR_RESIZED:
                  processHierarchyBoundsEvent((HierarchyEvent)e);
                  break;
            }
        }
    }

dispatchEventImpl()函數調用,從dispatchEvent()函數調用,從函數調用:

dispatchEvent(AWTEvent) : void - java.awt.Component
    addDelicately(Component, Container, int) : void - java.awt.Container
    addImpl(Component, Object, int) : void - java.awt.Container
    addNotify() : void - java.awt.Component
    close() : void - javax.swing.plaf.metal.MetalTitlePane
    createHierarchyEvents(int, Component, Container, long, boolean) : int - java.awt.Component (2 matches)
    dispatchAndCatchException(Throwable, Component, FocusEvent) : Throwable - java.awt.KeyboardFocusManager
    dispatchEventImpl(AWTEvent, Object) : void - java.awt.EventQueue
    forwardEventToParent(MouseEvent) : void - com.sun.java.swing.plaf.motif.MotifDesktopIconUI.IconButton
    forwardEventToParent(MouseEvent) : void - com.sun.java.swing.plaf.motif.MotifDesktopIconUI.IconLabel
    forwardEventToParent(MouseEvent) : void - com.sun.java.swing.plaf.motif.MotifInternalFrameTitlePane.Title
    mouseClicked(MouseEvent) : void - javax.swing.plaf.basic.BasicTreeUI.MouseInputHandler
    mouseDragged(MouseEvent) : void - javax.swing.plaf.basic.BasicTreeUI.MouseInputHandler
    MouseInputHandler(BasicTreeUI, Component, Component, MouseEvent, Component) - javax.swing.plaf.basic.BasicTreeUI.MouseInputHandler
    mouseReleased(MouseEvent) : void - javax.swing.plaf.basic.BasicTreeUI.MouseInputHandler
    postClosingEvent(JInternalFrame) : void - javax.swing.plaf.basic.BasicInternalFrameTitlePane
    redispatchEvent(Component, AWTEvent) : void - java.awt.KeyboardFocusManager
    remove(int) : void - java.awt.Container
    removeAll() : void - java.awt.Container
    removeDelicately(Component, Container, int) : boolean - java.awt.Container
    removeNotify() : void - java.awt.Component
    repostEvent(MouseEvent) : boolean - javax.swing.plaf.basic.BasicTableUI.Handler
    retargetMouseEvent(Component, int, MouseEvent) : void - java.awt.LightweightDispatcher (2 matches)

至於創建MouseEvent ,以下是一些調用new MouseEvent()的地方:

MouseEvent(Component, int, long, int, int, int, int, int, int, boolean, int) - java.awt.event.MouseEvent
    actionPerformed(ActionEvent) : void - javax.swing.Autoscroller
    convertMouseEvent(Component, MouseEvent, Component) : MouseEvent - javax.swing.SwingUtilities
    convertMouseEvent(MouseEvent) : MouseEvent - javax.swing.plaf.basic.BasicComboPopup
    eventDispatched(AWTEvent) : void - java.awt.LightweightDispatcher
    forwardEventToParent(MouseEvent) : void - com.sun.java.swing.plaf.motif.MotifDesktopIconUI.IconButton
    forwardEventToParent(MouseEvent) : void - com.sun.java.swing.plaf.motif.MotifDesktopIconUI.IconLabel
    forwardEventToParent(MouseEvent) : void - com.sun.java.swing.plaf.motif.MotifInternalFrameTitlePane.Title
    getToolTipText(MouseEvent) : String - javax.swing.JList
    getToolTipText(MouseEvent) : String - javax.swing.JTable
    getToolTipText(MouseEvent) : String - javax.swing.JTree
    getToolTipText(MouseEvent) : String - javax.swing.table.JTableHeader
    MenuDragMouseEvent(Component, int, long, int, int, int, int, int, int, boolean, MenuElement[], MenuSelectionManager) - javax.swing.event.MenuDragMouseEvent
    MouseEvent(Component, int, long, int, int, int, int, boolean, int) - java.awt.event.MouseEvent
    MouseWheelEvent(Component, int, long, int, int, int, int, int, int, boolean, int, int, int, double) - java.awt.event.MouseWheelEvent
    processMouseEvent(MouseEvent) : void - javax.swing.MenuSelectionManager (3 matches)
    processMouseEvent(MouseEvent) : void - javax.swing.plaf.basic.new JList() {...}
    retargetMouseEvent(Component, int, MouseEvent) : void - java.awt.LightweightDispatcher
    start(JComponent, MouseEvent) : void - javax.swing.Autoscroller

您可以繼續進行更深入的研究,但是在某些時候,您會到達本機代碼,操作系統會將底層事件發送給Java。

但是,大多數情況下,您無需關心任何這些東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM