我正在努力实现:
1.用户在父JFrame上执行鼠标按键
2.子JFrame在鼠标位置变为可见
3.当按下鼠标按钮时,用户可以通过移动鼠标
问题:
我可以模仿鼠标按下但它不会“抓住”子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!");
}
});
答案 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);
}
});
即使这不是完全清洁'因为代码依赖于父级的框架可见性。然而,它是一个稳定的解决方案(与机器人不同)。