Java - 冻结鼠标

3

有没有一种方法可以在Java中锁定鼠标在一个位置一段时间?

我尝试过以下代码:

while(timer == true){

    Robot bot = new Robot();
    bot.mouseMove(x, y);

}

但是当用户移动鼠标时,它会不愉快地来回跳动(从用户拖动的位置到应该锁定的位置)。
有没有更好的方法来解决这个问题?或者我可以完全禁用鼠标的用户输入吗?谢谢!

我想不到任何完全禁用鼠标移动的方法。尝试查看MouseMovementListeners http://docs.oracle.com/javase/tutorial/uiswing/events/mousemotionlistener.html - SpaceCowboy
它不应该限制用户,只是暂时的。 - Ood
3
@StackOverflowException 限制鼠标移动显然对大多数程序来说不是一个好主意,但这并不意味着根据为什么这样做而实施它是本质上邪恶的。按照同样的逻辑,这篇文章也不应该被回答:https://dev59.com/pmw15IYBdhLWcg3wqNgA?rq=1 告诉人们“我甚至不会考虑帮助”因为你不需要这样做是相当居高临下的。 - SimonT
1
@SimonT:很有可能。我只是想不出任何好理由来限制用户,即使只有半秒钟。 - tilpner
1
@tilpner,想想像Minecraft这样的游戏,这些游戏限制鼠标移动,以便在玩游戏时鼠标不会离开屏幕。OP可能只是想做类似的事情。 - madladzen
1个回答

4
这是你可以走得最远的地方了(至少使用标准库是如此)。鼠标的“跳跃”取决于系统,具体取决于侦听器的“采样率”。我不知道有没有影响它的JVM参数,但如果有类似的东西我也不会感到惊讶。跳跃与鼠标加速度相反(在样本之间,鼠标可以移动“长”的距离)。
public class Stop extends JFrame {

    static Robot robot = null;
    static Rectangle bounds = new Rectangle(300, 300, 300, 300);
    static int lastX = 450; static int lastY = 450;

    Stop() {

        try {
            robot = new Robot();
        } catch (AWTException e) {
            e.printStackTrace();
        }
        addMouseMotionListener(new MouseStop());

        getContentPane().add(new JLabel("<html>A sticky situation<br>Hold SHIFT to get out of it", JLabel.CENTER));
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(bounds);
        setVisible(true);
    }

    private static class MouseStop extends MouseAdapter {

        @Override
        public void mouseMoved(MouseEvent e) {

            if(e.isShiftDown()) {
                lastX = e.getXOnScreen();
                lastY = e.getYOnScreen();
            }
            else
                robot.mouseMove(lastX, lastY);
        }
    }

    public static void main(String args[]) {

        new Stop();
    }
}

编辑:我刚有一个想法,就是将光标的绘制处理成看起来像鼠标没有移动。如果有什么实现的代码,我会添加上去。


谢谢!非常好的答案! - Ood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接