模拟MousePress进入MouseDragged

时间:2014-09-15 10:54:37

标签: java jframe mouseevent mouselistener

我正在努力实现:
1.用户在父JFrame上执行鼠标按键 2.子JFrame在鼠标位置变为可见 3.当按下鼠标按钮时,用户可以通过移动鼠标

在屏幕上拖动子JFrame

问题:
我可以模仿鼠标按下但它不会“抓住”子JFrame - 因此除非用户再次手动点击子JFrame,否则不会拖动子JFrame。我希望这个过程顺利进行而不会出现任何中断:即步骤1-3(上面)都应该通过一次鼠标按下来执行。

尝试失败:
1.我尝试使用Robot的mousePressed()模拟对孩子进行额外的鼠标按压。然而,这是有效的,它不干净并且可能非常错误 - 特别是如果PC /设备很慢或用户移动鼠标太快。这不是一个好的解决方案 2.使用Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(new MouseEvent());导致完全相同的问题,如当前代码所示 3.当向子项和父项添加KeyListener(用于测试)时,在按下鼠标时,子窗口将被聚焦并响应实现的KeyListener - 父项的KeyListener未被激活..

守则:

    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!");
        }
    });

1 个答案:

答案 0 :(得分:0)

即使子JFrame具有焦点,MousePress仍然在父级上保持活动状态。为了以稳定的方式解决问题,家长应该转发'它的MouseDragged事件给孩子,如下所示:

    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);
        }
    });

即使这不是完全清洁'因为代码依赖于父级的框架可见性。然而,它是一个稳定的解决方案(与机器人不同)。