2010-03-31 55 views
1

我正在开展一项学校作业,要求我能够拾取一个图块并将其拖放到某个位置,然后将其放到那里。我可以使用TransferHandler和dnd包中的一些东西来实现这个工作,但根据教授的说法,这不是一种可接受的方式来执行此任务。所以,我试图用MouseListener接口达到相同的效果。使用MouseListener实现自定义组件的拖放操作

基本设置是这样的:我有一个名为LocationView一个JPanel派生类,它包含的TileViewJLabel -dervived实例。我需要得到的事件给我的LocationView有鼠标按下和LocationView有鼠标释放。我通过TileView代理鼠标事件到其包含LocationView,以便我可以正确处理mousePressed事件。

我加System.out.println()的鼠标侦听器mousePressedmouseReleasedLocationViewTileView这样我就可以看到正在发生的事件。令我惊讶的是,在地点A的平铺A上按下鼠标,然后拖动到地点B并释放,将为平铺A和地点A生成鼠标释放事件,但不生成地点B.我需要鼠标释放事件位置B.

要尝试解决此问题,我尝试实施基于FinalGlassPanehttp://weblogs.java.net/blog/2006/09/20/well-behaved-glasspane找到的玻璃窗格。添加玻璃窗格并为其添加事件侦听器后,我可以看到鼠标事件确实正在通过玻璃窗格进行过滤,但鼠标释放的事件仍然只在鼠标点击的项目上被调用。

有没有办法让mousePressedmouseReleased事件与同一拖动操作相关联,并在不同的组件上调用?

编辑: 这里是我到达,基于关闭答案通过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

虽然它很可能可能有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()); 
} 
+0

该来源位置的翻译似乎没有在我的情况下工作。当我点击一个图块时,我得到的源位置为1,1,然后将它们转换为我所在的图块。这意味着生成的坐标不正确,导致错误的组件选择。 – 2010-04-01 01:56:49

+0

我调整了一下你的代码,最终让它工作。由于我拥有嵌套组件的数量,所以需要进行调整。该解决方案作为对原始问题的编辑发布。 – 2010-04-01 02:11:41