2012-07-16 75 views
1

我有一个JFrame,其中包含许多具有不同功能的子组件和子面板。我为其中的一些添加了mouseListeners。查看鼠标按钮何时未被添加到所有组件的情况下点击鼠标按钮

我希望能够在框架中单击鼠标按钮时调用某个函数,而不管哪个组件处于焦点位置。我不想将mouselisteners添加到所有组件。与keyEventDispacher非常相似,我将它用于键盘。

我已经看过这个Dispatch MouseEvent但我无法解决这个问题。任何人都可以给我一个小例子来演示它的工作原理吗?

+0

即使点击交互式组件(例如'JButton'),你还想调用它吗? – Mohayemin 2012-07-16 11:43:08

回答

2

这里是全球鼠标监听一个简单的例子:

public static void main (String[] args) 
{ 
    final JFrame frame = new JFrame(); 

    // Some content 
    frame.getContentPane().setLayout (new FlowLayout (FlowLayout.CENTER, 5, 5)); 
    frame.getContentPane().add (new JButton ("Test")); 
    frame.getContentPane().add (new JLabel ("Test")); 
    frame.getContentPane().add (new JTextField ("Test")); 

    // Global mouse listener 
    final AWTEventListener listener = new AWTEventListener() 
    { 
     public void eventDispatched (AWTEvent event) 
     { 
      // Event and component that recieved that event 
      MouseEvent me = (MouseEvent) event; 
      Component c = me.getComponent(); 

      // Ignoring mouse events from any other frame 
      if (SwingUtilities.getWindowAncestor (c) == frame) 
      { 
       if (event.getID() == MouseEvent.MOUSE_PRESSED) 
       { 
        System.out.println ("Mouse pressed on " + c.getClass().getCanonicalName()); 
       } 
       if (event.getID() == MouseEvent.MOUSE_RELEASED) 
       { 
        System.out.println ("Mouse released on " + c.getClass().getCanonicalName()); 
       } 
       if (event.getID() == MouseEvent.MOUSE_ENTERED) 
       { 
        System.out.println ("Mouse entered " + c.getClass().getCanonicalName()); 
       } 
       if (event.getID() == MouseEvent.MOUSE_EXITED) 
       { 
        System.out.println ("Mouse exited " + c.getClass().getCanonicalName()); 
       } 
      } 
     } 
    }; 
    Toolkit.getDefaultToolkit().addAWTEventListener (listener, AWTEvent.MOUSE_EVENT_MASK); 

    frame.pack(); 
    frame.setLocationRelativeTo (null); 
    frame.setVisible (true); 
} 

注意,这个监听器会通知你任何帧/对话框/窗口/弹出里面大约每鼠标事件。这就是为什么你应该限制你的行动像一些特定的框架,就像我不在其他框架/窗口/全球的事件(例如关键事件)使用相同的方法。例如 - 使用AWTEvent.KEY_EVENT_MASK键代替AWTEvent.MOUSE_EVENT_MASK,并将AWTEvent强制转换为KeyEvent而不是MouseEvent。

0

尝试使用MouseEvent Class,用静态方法MOUSE_CLICKED

在这里看到更多细节:

http://docs.oracle.com/javase/6/docs/api/java/awt/event/MouseEvent.html

请参阅从roseindia这个例子

import java.awt.*; 
import java.awt.event.*; 

public class MouseClick { 
    Label lbl; 
    public static void main(String[] args) { 
    MouseClick MC = new MouseClick(); 
    } 

    public MouseClick(){ 
    Frame f = new Frame("Checking the mouse click"); 
    Panel p = new Panel(); 
    Button button = new Button("Click Me"); 
    button.addMouseListener(new MyMouseListener()); 
    p.add(button, BorderLayout.NORTH); 
    f.add(p,BorderLayout.NORTH); 
    lbl = new Label("Roseindia.net"); 
    f.add(lbl, BorderLayout.CENTER); 
    f.addWindowListener(new WindowAdapter(){ 
    public void windowClosing(WindowEvent we){ 
    System.exit(0); 
    } 
    }); 
    f.setSize(400,400); 
    f.setVisible(true); 
    } 

    public class MyMouseListener extends MouseAdapter{ 
    public void mouseClicked(MouseEvent me){ 
    String str = lbl.getText(); 
    if (str.equals("Roseindia.net")){ 
    lbl.setText("You have clicke the button."); 
    } 
    else if (str.equals("You have clicke the button.")){ 
    lbl.setText("Roseindia.net"); 
    } 
    } 
    } 
} 

从Oracle

public class MouseEventDemo ... implements MouseListener { 
      //where initialization occurs: 
      //Register for mouse events on blankArea and the panel. 
      blankArea.addMouseListener(this); 
      addMouseListener(this); 
     ... 

     public void mousePressed(MouseEvent e) { 
      saySomething("Mouse pressed; # of clicks: " 
         + e.getClickCount(), e); 
     } 

     public void mouseReleased(MouseEvent e) { 
      saySomething("Mouse released; # of clicks: " 
         + e.getClickCount(), e); 
     } 

     public void mouseEntered(MouseEvent e) { 
      saySomething("Mouse entered", e); 
     } 

     public void mouseExited(MouseEvent e) { 
      saySomething("Mouse exited", e); 
     } 

     public void mouseClicked(MouseEvent e) { 
      saySomething("Mouse clicked (# of clicks: " 
         + e.getClickCount() + ")", e); 
     } 

     void saySomething(String eventDescription, MouseEvent e) { 
      textArea.append(eventDescription + " detected on " 
          + e.getComponent().getClass().getName() 
          + "." + newline); 
     } 
    }