我正在开展一项学校作业,要求我能够拾取一个图块并将其拖放到某个位置,然后将其放到那里。我可以使用TransferHandler
和dnd包中的一些东西来实现这个工作,但根据教授的说法,这不是一种可接受的方式来执行此任务。所以,我试图用MouseListener
接口达到相同的效果。使用MouseListener实现自定义组件的拖放操作
基本设置是这样的:我有一个名为LocationView
一个JPanel
派生类,它包含的TileView
JLabel
-dervived实例。我需要得到的事件给我的LocationView
有鼠标按下和LocationView
有鼠标释放。我通过TileView
代理鼠标事件到其包含LocationView
,以便我可以正确处理mousePressed
事件。
我加System.out.println()
的鼠标侦听器mousePressed
和mouseReleased
既LocationView
和TileView
这样我就可以看到正在发生的事件。令我惊讶的是,在地点A的平铺A上按下鼠标,然后拖动到地点B并释放,将为平铺A和地点A生成鼠标释放事件,但不生成地点B.我需要鼠标释放事件位置B.
要尝试解决此问题,我尝试实施基于FinalGlassPane
的http://weblogs.java.net/blog/2006/09/20/well-behaved-glasspane找到的玻璃窗格。添加玻璃窗格并为其添加事件侦听器后,我可以看到鼠标事件确实正在通过玻璃窗格进行过滤,但鼠标释放的事件仍然只在鼠标点击的项目上被调用。
有没有办法让mousePressed
和mouseReleased
事件与同一拖动操作相关联,并在不同的组件上调用?
编辑: 这里是我到达,基于关闭答案通过lins314159
public void mouseReleased(MouseEvent e) {
Point p = SwingUtilities.convertPoint(LocationView.this, ((Component)e.getSource()).getLocation(), LocationView.this.wsa.getGameView());
e.translatePoint((int) p.getX(), (int) p.getY());
Component tile = SwingUtilities.getDeepestComponentAt(LocationView.this.wsa.getGameView(), e.getX(), e.getY());
}
该来源位置的翻译似乎没有在我的情况下工作。当我点击一个图块时,我得到的源位置为1,1,然后将它们转换为我所在的图块。这意味着生成的坐标不正确,导致错误的组件选择。 – 2010-04-01 01:56:49
我调整了一下你的代码,最终让它工作。由于我拥有嵌套组件的数量,所以需要进行调整。该解决方案作为对原始问题的编辑发布。 – 2010-04-01 02:11:41