Java无限相对鼠标拖动事件

时间:2013-06-03 22:03:25

标签: java swing swt awt mouse

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

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

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

有没有办法让这个工作用Java?

1 个答案:

答案 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);
}