有没有办法在其中一个Java GUI框架中为用户提供无限的相对鼠标拖动事件?
我想要一个用户可以单击并拖动的GUI元素,但该元素不会移动:相反,某些参数(比如颜色,体积,缩放级别等)会根据距离的比例进行调整。用户移动鼠标。
Swing和SWT的问题在于他们想要报告鼠标坐标,并且这些坐标受到屏幕尺寸的限制。如果在拖动操作期间鼠标指针碰到屏幕边缘,我恐怕我的GUI元素会突然停止调整以便用户进一步移动鼠标。
有没有办法让这个工作用Java?
答案 0 :(得分:2)
您可能希望查看Robot
课程,特别是Robot#mouseMove(int, int)。
您可以在通过MouseMotionListener
拖动的UI组件上侦听鼠标拖动事件,找到拖动的差异并将鼠标重新定位到组件上。
这是一个快速而肮脏的测试,以表明这个想法是有效的。 注意:您可能希望清理鼠标的位置以保持在同一位置;目前它只是将鼠标重新定位到JLabel
public static void main(String[] args) throws AWTException {
final JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(new Dimension(400, 400));
JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
final Robot r = new Robot();
JLabel label = new JLabel("Hello World");
label.setBackground(Color.ORANGE);
label.setOpaque(true);
label.addMouseMotionListener(new MouseMotionListener() {
public void mouseMoved(MouseEvent e) {}
public void mouseDragged(MouseEvent e) {
JLabel label = (JLabel) e.getSource();
Point point = label.getLocationOnScreen();
point.x += (label.getWidth() / 2);
point.y += (label.getHeight() / 2);
r.mouseMove(point.x, point.y);
Point movedPoint = e.getLocationOnScreen();
int diffX = point.x - movedPoint.x;
int diffY = point.y - movedPoint.y;
System.out.println("Dragged: " + diffX + ", " + diffY);
}
});
panel.add(label);
frame.add(panel);
frame.setVisible(true);
}