我想要实现的:
问题:
我可以模仿鼠标-按下,但它不会‘抓取’子JFrame -因此,子JFrame不会被拖动,除非用户再次手动单击子JFrame。我希望过程顺利,不受任何干扰:即,步骤1-3 (上面)都应该用一个鼠标按下执行。
失败:
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(new MouseEvent());会产生与当前代码所描述的完全相同的问题。代码:
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!");
}
});发布于 2014-09-15 12:55:11
即使子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);
}
});甚至这也不是完全“干净”的,因为代码依赖于父框架的可见性。然而,它是一个稳定的解决方案(不像机器人)。
https://stackoverflow.com/questions/25846441
复制相似问题