查看鼠标按钮何时未被添加到所有组件的情况下点击鼠标按钮
我有一个JFrame,其中包含许多具有不同功能的子组件和子面板。我为其中的一些添加了mouseListeners。查看鼠标按钮何时未被添加到所有组件的情况下点击鼠标按钮
我希望能够在框架中单击鼠标按钮时调用某个函数,而不管哪个组件处于焦点位置。我不想将mouselisteners添加到所有组件。与keyEventDispacher非常相似,我将它用于键盘。
我已经看过这个Dispatch MouseEvent但我无法解决这个问题。任何人都可以给我一个小例子来演示它的工作原理吗?
这里是全球鼠标监听一个简单的例子:
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。
尝试使用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);
}
}
见这个例子这将在最好的时候是混乱和痛苦的世界......
入住这里Global Event Listeners with AWTEventListener & how to pull MouseEvent's from it一种替代概念。基本上它是一个全球鼠标监听器。你需要做很多工作才能让它适合你(检查孩子是否属于父母等),但它确实很好。
即使点击交互式组件(例如'JButton'),你还想调用它吗? – Mohayemin 2012-07-16 11:43:08