0

有没有办法在其中一个 Java GUI 框架中为用户提供无限的相对鼠标拖动事件?

我想要一个用户可以单击和拖动的 GUI 元素,但该元素不会移动:相反,某些参数(例如颜色、音量、缩放级别等)会根据用户移动的距离进行调整鼠。

Swing 和 SWT 的问题在于它们想要报告鼠标坐标,而这些坐标受屏幕尺寸的限制。如果在拖动操作期间鼠标指针碰到屏幕边缘,恐怕我的 GUI 元素会突然停止适应用户进一步的鼠标移动。

有没有办法在 Java 中完成这项工作?

4

1 回答 1

2

您可能想要查看该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);
}
于 2013-06-03T23:05:04.840 回答