使用MouseListener为自定义组件实现拖放

时间:2010-03-31 21:07:18

标签: java swing

我正在完成一项学校任务,要求我能够拿起一块瓷砖,将它拖到一个位置,然后放在那里。我能够使用TransferHandler以及来自dnd包的一堆东西来使用它,但根据教授的说法,这不是一种可以接受的方法来执行此操作。所以,我试图使用MouseListener接口实现相同的效果。

基本设置如下:我有一个名为JPanel的{​​{1}}派生类,其中包含LocationView - JLabel的衍生实例。我需要获取的事件能够为我提供鼠标按下的TileView和释放鼠标的LocationView。我通过LocationView将鼠标事件代理到包含TileView的鼠标事件,以便我能够正确处理LocationView事件。

我将mousePressed添加到System.out.println()mousePressed的鼠标听众,同时添加mouseReleasedLocationView,以便我可以观察到的事件正在生成。令我惊讶的是,在位置A的Tile A上按下鼠标,然后拖动到位置B并释放将为Tile A和位置A生成鼠标释放事件,但不会为位置B生成鼠标。我需要仅触发鼠标释放事件位置B.

为了解决这个问题,我尝试根据http://weblogs.java.net/blog/2006/09/20/well-behaved-glasspane处的TileView实施一个玻璃窗格。添加玻璃窗格并为其添加事件侦听器后,我可以看到鼠标事件确实通过玻璃窗格过滤,但鼠标释放事件仍然只在单击鼠标的项目上被调用。

是否可以在单独的组件上调用与同一拖动操作关联的FinalGlassPanemousePressed事件?

编辑: 根据lins314159

的答案,这是我得到的解决方案
mouseReleased

1 个答案:

答案 0 :(得分:1)

虽然可能有mouseReleased给实际组件鼠标作为其来源发布,但它会比它的价值更麻烦。

以下内容可用于识别释放鼠标的组件。

public void mouseReleased(MouseEvent evt) {
    Point p = ((Component) evt.getSource()).getLocation();
    evt.translatePoint((int) p.getX(), (int) p.getY());
    Component tile = f.getContentPane().getComponentAt(evt.getX(), evt.getY());
}