我一直在尝试制作一个锁屏程序,它是一个包含多个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);
}
}
答案 0 :(得分:0)
问题是MouseEvent.GetSource(已转换为单元格)仅返回拖动开始的单元格
这是正确的。所有事件都将相对于拖动开始时单击的单元格。
如果您想知道当前的单元格,那么您需要自己进行计算。
因此,您可以使用MouseEvent中的getPoint()
方法,然后计算您结束的组件。
例如,您可以使用SwingUtilities.convertPoint(...)
方法将点转换为父容器。
然后,一旦您拥有相对于父容器的Point,您就可以使用Container.findComponentAt(...)
方法在容器上找到当前组件。
您需要跟踪找到的每个组件。也许将组件添加到Set
。
或者,而不是将侦听器添加到每个单元格。您只需将侦听器添加到父面板即可。然后所有点都将相对于面板,因此您不需要转换点,只需执行findComponentAt(...)
逻辑。