Java 查看单击鼠标按钮而不向所有组件添加鼠标侦听器的时间
我有一个JFrame,它有很多子组件和具有不同功能的子面板。我给其中一些加了鼠标听筒 我希望能够在框架中单击鼠标按钮时调用函数,而不管焦点是哪个组件。我不想在所有组件中添加鼠标侦听器。很像keyEventDispacher,我将其用于键盘Java 查看单击鼠标按钮而不向所有组件添加鼠标侦听器的时间,java,swing,jframe,mouseevent,mouselistener,Java,Swing,Jframe,Mouseevent,Mouselistener,我有一个JFrame,它有很多子组件和具有不同功能的子面板。我给其中一些加了鼠标听筒 我希望能够在框架中单击鼠标按钮时调用函数,而不管焦点是哪个组件。我不想在所有组件中添加鼠标侦听器。很像keyEventDispacher,我将其用于键盘 我已经看过了,但是我没能解决它。有人能给我一个小例子来演示它是如何工作的吗?尝试使用MouseEvent类,使用静态方法单击鼠标 有关更多详细信息,请参见此处: 参见roseindia的示例 import java.awt.*; import java.aw
我已经看过了,但是我没能解决它。有人能给我一个小例子来演示它是如何工作的吗?尝试使用
MouseEvent类
,使用静态方法单击鼠标
有关更多详细信息,请参见此处:
参见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);
}
}
这将是一个混乱和痛苦的世界在最好的时候
在这里查看另一个概念。基本上,它是一个全局鼠标侦听器。您需要做很多工作才能让它为您工作(检查子项是否属于父项等),但它确实很有效。下面是一个简单的全局鼠标侦听器示例:
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\u EVENT\u MASK键而不是AWTEvent.MOUSE\u EVENT\u MASK,并将AWTEvent转换为KeyEvent而不是MouseEvent。即使单击交互式组件(例如
JButton
)也要调用它吗?