有没有办法在其中一个 Java GUI 框架中为用户提供无限的相对鼠标拖动事件?
我想要一个用户可以单击和拖动的 GUI 元素,但该元素不会移动:相反,某些参数(例如颜色、音量、缩放级别等)会根据用户移动的距离进行调整鼠。
Swing 和 SWT 的问题在于它们想要报告鼠标坐标,而这些坐标受屏幕尺寸的限制。如果在拖动操作期间鼠标指针碰到屏幕边缘,恐怕我的 GUI 元素会突然停止适应用户进一步的鼠标移动。
有没有办法在 Java 中完成这项工作?
您可能想要查看该Robot
课程,特别是Robot#mouseMove(int, int)。
您可以通过 监听正在拖动的 UI 组件上的鼠标拖动事件MouseMotionListener
,找到拖动的差异并将鼠标重新定位到组件上。
这是一个快速而肮脏的测试,表明这个想法是有效的。注意:您可能希望清理鼠标的定位以保持在同一位置;目前它只是将鼠标重新定位到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);
}