MouseMotionAdapter接口

文章来源:通过MouseMotionAdapter接口监听鼠标当前位置

 

Java中通过MouseMotionAdapter接口监听鼠标当前位置,然后将鼠标的位置信息通过Label显示出来。代码如下:
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;

public class TestAnonymousMonitor{
Frame f = new Frame("匿名内部类测试");
TextField tf = new TextField(30);
public TestAnonymousMonitor(){
f.add(new Label("请按下鼠标左键并拖动"), "North");
f.add(tf, "South");
f.addMouseMotionListener(new MouseMotionAdapter(){
public void mouseDragged(MouseEvent e) {
tf.setText("鼠标位置" + e.getPoint());
}
});
f.setBackground(Color.CYAN);
f.setSize(300, 200);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
f.setVisible(true);
}
public static void main(String args[]) {
new TestAnonymousMonitor();
}

}

 

效果图:

 

 

import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import javax.swing.*; public class SmartMouseShaker { private static volatile Point lastPosition; private static long lastMoveTime; private static final int CHECK_INTERVAL = 500; // 检测间隔500ms(平衡性能与响应) private static final int SHAKE_CYCLES = 2; // 抖动周期数(增强效果) public static void main(String[] args) { // 1. 验证图形环境兼容性 if (GraphicsEnvironment.isHeadless()) { System.err.println("Error: Headless environment not supported. Exiting..."); return; } // 2. 初始化机器人控制 final Robot robot; try { robot = new Robot(); } catch (AWTException e) { System.err.println("Failed to initialize Robot: " + e.getMessage()); return; } // 3. 创建隐式窗口实现事件监听(避免轮询CPU占用) JFrame hiddenFrame = new JFrame(); hiddenFrame.setUndecorated(true); hiddenFrame.setSize(1, 1); // 最小化窗口尺寸 hiddenFrame.setLocation(-100, -100); // 移出可视区域 hiddenFrame.setVisible(true); // 4. 鼠标移动事件监听(替代轮询) hiddenFrame.addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent e) { lastPosition = e.getPoint(); lastMoveTime = System.currentTimeMillis(); } }); // 5. 定时检测线程 new Thread(() -> { lastPosition = MouseInfo.getPointerInfo().getLocation(); lastMoveTime = System.currentTimeMillis(); while (true) { try { Thread.sleep(CHECK_INTERVAL); long currentTime = System.currentTimeMillis(); // 检测静止超时(1分钟=60,000ms) if (currentTime - lastMoveTime >= 60000) { shakeMouse(robot); lastMoveTime = currentTime; // 重置计时器 } } catch (InterruptedException e) { Thread.currentThread().interrupt(); break; } } }).start(); System.out.println("Mouse Shaker is running. Press Ctrl+C to exit."); } private static void shakeMouse(Robot robot) { Point p = MouseInfo.getPointerInfo().getLocation(); int baseX = (int) p.getX(); int baseY = (int) p.getY(); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); // 限制抖动范围(避免移出屏幕) int maxOffsetX = Math.min(15, screenSize.width - baseX - 10); int maxOffsetY = Math.min(10, screenSize.height - baseY - 10); int offsetX = Math.max(10, maxOffsetX); // 确保最小幅度 int offsetY = Math.max(8, maxOffsetY); // 多方向抖动(增强自然感) for (int i = 0; i < SHAKE_CYCLES; i++) { robot.mouseMove(baseX + offsetX, baseY + offsetY); robot.delay(40); robot.mouseMove(baseX - offsetX, baseY - offsetY); robot.delay(40); } robot.mouseMove(baseX, baseY); // 精准回归原位 } }
09-20
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值