我正在完成一项学校任务,要求我能够拿起一块瓷砖,将它拖到一个位置,然后放在那里。我能够使用TransferHandler
以及来自dnd包的一堆东西来使用它,但根据教授的说法,这不是一种可以接受的方法来执行此操作。所以,我试图使用MouseListener
接口实现相同的效果。
基本设置如下:我有一个名为JPanel
的{{1}}派生类,其中包含LocationView
- JLabel
的衍生实例。我需要获取的事件能够为我提供鼠标按下的TileView
和释放鼠标的LocationView
。我通过LocationView
将鼠标事件代理到包含TileView
的鼠标事件,以便我能够正确处理LocationView
事件。
我将mousePressed
添加到System.out.println()
和mousePressed
的鼠标听众,同时添加mouseReleased
和LocationView
,以便我可以观察到的事件正在生成。令我惊讶的是,在位置A的Tile A上按下鼠标,然后拖动到位置B并释放将为Tile A和位置A生成鼠标释放事件,但不会为位置B生成鼠标。我需要仅触发鼠标释放事件位置B.
为了解决这个问题,我尝试根据http://weblogs.java.net/blog/2006/09/20/well-behaved-glasspane处的TileView
实施一个玻璃窗格。添加玻璃窗格并为其添加事件侦听器后,我可以看到鼠标事件确实通过玻璃窗格过滤,但鼠标释放事件仍然只在单击鼠标的项目上被调用。
是否可以在单独的组件上调用与同一拖动操作关联的FinalGlassPane
和mousePressed
事件?
编辑: 根据lins314159
的答案,这是我得到的解决方案mouseReleased
答案 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());
}