【问题标题】:MouseMotionListener on MouseDragged Only Returns The Component The Drag Started OnMouseDragged 上的 MouseMotionListener 仅返回开始拖动的组件
【发布时间】:2017-11-15 15:16:55
【问题描述】:

我一直在尝试制作一个锁屏程序,它是一个包含多个 JPanel 的 JFrame。我在每个面板(单元格)类中添加了一个 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);
    }
}

【问题讨论】:

  • 你能解释一下“拖入多个单元格”吗?
  • @Berger 我的意思是把鼠标从一个单元格拖到另一个单元格。
  • 所以你想要在拖动过程中悬停的所有单元格?
  • @Berger 是的,到目前为止,它只返回拖动移动开始的单元格。我不认为我做错了什么,因为 javadoc (docs.oracle.com/javase/7/docs/api/java/awt/event/…) 说无论鼠标是否在组件范围内,它都不会更改单元格。我需要某种替代方法。
  • 您可以在Cell 中添加boolean selected;,然后当单元格收到mouseDragged 时,将此值设置为true。最后,当您需要整个列表时,检查每个单元格的selected 值。

标签: java swing drag-and-drop


【解决方案1】:

问题是 MouseEvent.GetSource(投射到一个单元格)只返回拖动开始的单元格

没错。所有事件都将与您开始拖动时单击的单元格相关。

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

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

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

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

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

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

【讨论】:

  • 我正在使用 findComponentAt 方法,它运行良好!感谢您的帮助!
猜你喜欢
  • 2018-01-23
  • 1970-01-01
  • 2018-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
相关资源
最近更新 更多