1

我目前正在开发一个拖放应用程序,我真的很想知道 JLayeredPane 内部发生了什么,并且我得到了一个特定的程序行为......

这是交易:

我在 DEFAULT_LAYER 上放置了一个棋盘。
我还有一个棋子,我想在移动它时将其添加到 DRAG_LAYER 中。

但是我有恋物癖...

我想用这条线

layeredPane.add(chessPiece, JLayeredPane.DRAG_LAYER);

仅在 mouseDragged 事件下。

因此,当我这样做时,我的 chessPiece 在移动鼠标时消失并隐藏在棋盘后面(?!?)

当我将上面的行更改为:

layeredPane.add(chessPiece, JLayeredPane.DRAG_LAYER,0);

一切又变得正常了。

为什么会这样?

4

4 回答 4

1

我使用layeredPane.moveToFront(component)而不是依赖index参数。

请注意,add(Component comp, Object constraints, int index)是由 实现的java.awt.Container,而不是javax.swing.JLayeredPane

于 2009-09-25T05:11:28.597 回答
1

您必须使用 GlassPane。在开始翻译标签之前,您必须在 MouseDragged 事件中使用 GlassPane.Add(label) 和 label.setLocation(x,y)。侦听器必须是 MouseMotionListener 而不是普通的 MouseListener。

于 2010-08-18T20:29:24.600 回答
0

问题是这两种方法有什么区别?好吧,如果您阅读 API,您会发现不同之处。在第一种情况下,组件被添加到容器的“末端”。在第二种情况下,组件被添加到容器中的“指定位置”。

由于只有一个组件添加到 DragLayer,理论上使用哪种添加方法应该没有区别。但是,由于您在 DefaultLayer 上也有一个组件,因此可能会有所不同。唯一确定的方法是查看源代码。

但是,正如您在其他帖子中已经建议的那样。此代码不应在 mouseDragged() 事件中完成。由于生成了多个拖动事件,因此不断地将棋子“添加”到拖动布局是没有意义的。您需要做的就是在移动鼠标时更改棋子的位置。这就是为什么使用 mousePressed() 事件将棋子添加到拖动层的原因。

于 2009-09-25T05:35:55.537 回答
0

我也使用了上述诊断方法,结果如下:

int number = layeredPane.getLayer(chessPiece);

int number3 = layeredPane.getComponentCountInLayer(JLayeredPane.DRAG_LAYER);

拖动时,第一个总是返回数字 400,这是拖动层的符号。但是另一个首先返回一个 1,但是当我们拖动它时它都变成了零......

这意味着至少在一段时间内,棋子实际上进入了阻力层,然后掉了下来。但是,如果您询问窗格,就会发生这种情况...

这有帮助吗?另外,你介意给我一个 jlayeredpane 源代码的链接吗?

我正在寻找 JLayeredPane.java 但到目前为止还没有运气......

提前谢谢...

于 2009-09-25T22:15:19.707 回答