首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟MousePress进入MouseDragged

模拟MousePress进入MouseDragged
EN

Stack Overflow用户
提问于 2014-09-15 10:54:37
回答 1查看 154关注 0票数 0

我想要实现的

  1. 用户对父JFrame执行鼠标按压。
  2. 子JFrame在鼠标位置可见
  3. 当鼠标按钮仍然按下时,用户可以通过移动鼠标将子JFrame拖过屏幕。

问题:

我可以模仿鼠标-按下,但它不会‘抓取’子JFrame -因此,子JFrame不会被拖动,除非用户再次手动单击子JFrame。我希望过程顺利,不受任何干扰:即,步骤1-3 (上面)都应该用一个鼠标按下执行。

失败:

  1. 我尝试过使用机器人的mousePressed()来模拟一个额外的鼠标按在孩子身上。但是,这是不干净的,而且可能会很麻烦--特别是当PC/设备速度慢或者用户移动鼠标太快的时候。这不是一个好的解决办法。
  2. 使用Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(new MouseEvent());会产生与当前代码所描述的完全相同的问题。
  3. 当将KeyListener (用于测试)添加到子窗口和父窗口时,当鼠标按下鼠标时,子窗口将聚焦并响应已实现的KeyListener --父窗口的KeyListener未被激活。

代码:

代码语言:javascript
复制
    final JFrame parent = new JFrame(), child = new JFrame();
    parent.setSize(256, 256);
    child.setSize(128,128);
    parent.setVisible(true);

    parent.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            child.setVisible(true);
            child.setLocation(e.getXOnScreen()-48, e.getYOnScreen()-48);
            int id = MouseEvent.MOUSE_PRESSED;
            long time = System.currentTimeMillis();
            int x = 48;
            int y = 48;
            int button = MouseEvent.BUTTON1_MASK;
            child.dispatchEvent(new MouseEvent(child, id, time, button, x, y, 1, false));
        }
    });

    child.addMouseMotionListener(new MouseAdapter() {
        @Override
        public void mouseDragged(MouseEvent e) {
            child.setLocation(e.getXOnScreen()-48, e.getYOnScreen()-48);
        }
    });

    child.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            System.out.println("Pressed!");
        }
    });
EN

回答 1

Stack Overflow用户

发布于 2014-09-15 12:55:11

即使子JFrame有焦点,MousePress在父上仍然是活动的。要以稳定的方式解决问题,父级应该将其MouseDragged事件“转发”给子节点,如下所示:

代码语言:javascript
复制
    parent.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            child.setVisible(true);
            child.setLocation(e.getXOnScreen()-48, e.getYOnScreen()-48);
        }
    });

    parent.addMouseMotionListener(new MouseAdapter() {
        @Override
        public void mouseDragged(MouseEvent e) {
            child.dispatchEvent(new MouseEvent(child, e.getID(), e.getWhen(), e.getButton(), e.getX(), e.getY(), e.getClickCount(), e.isPopupTrigger()));
        }
    });

    child.addMouseMotionListener(new MouseAdapter() {
        @Override
        public void mouseDragged(MouseEvent e) {
            child.setLocation(parent.getX()+e.getX()-48, parent.getY()+e.getY()-48);
        }
    });

甚至这也不是完全“干净”的,因为代码依赖于父框架的可见性。然而,它是一个稳定的解决方案(不像机器人)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25846441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档