MouseDragged上的MouseMotionListener仅返回组件拖动开始

时间:2017-11-15 15:16:55

标签: java swing drag-and-drop

我一直在尝试制作一个锁屏程序,它是一个包含多个JPanel的JFrame。我在每个面板(Cell)类中添加了一个MouseMotionListener。我希望它能让用户拖动鼠标并能够拖动到多个单元格中。问题是MouseEvent.GetSource(转换为单元格)仅返回拖动开始的单元格。这是我的代码。

public class Cell extends JPanel {

    public String name;

    public Cell(String name, Color color) {
        this.name = name;
        addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                onMouseOver(e);
            }
        });
        setBackground(color);
        setVisible(true);
        repaint();
    }

    private void onMouseOver(MouseEvent e) {
        System.out.println(name);
    }
}

1 个答案:

答案 0 :(得分:0)

  

问题是MouseEvent.GetSource(已转换为单元格)仅返回拖动开始的单元格

这是正确的。所有事件都将相对于拖动开始时单击的单元格。

如果您想知道当前的单元格,那么您需要自己进行计算。

因此,您可以使用MouseEvent中的getPoint()方法,然后计算您结束的组件。

例如,您可以使用SwingUtilities.convertPoint(...)方法将点转换为父容器。

然后,一旦您拥有相对于父容器的Point,您就可以使用Container.findComponentAt(...)方法在容器上找到当前组件。

您需要跟踪找到的每个组件。也许将组件添加到Set

或者,而不是将侦听器添加到每个单元格。您只需将侦听器添加到父面板即可。然后所有点都将相对于面板,因此您不需要转换点,只需执行findComponentAt(...)逻辑。