Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在mouseDragged事件下的DRAG_层上添加JLabel_Java_Swing_Drag And Drop_Jlayeredpane - Fatal编程技术网

Java 如何在mouseDragged事件下的DRAG_层上添加JLabel

Java 如何在mouseDragged事件下的DRAG_层上添加JLabel,java,swing,drag-and-drop,jlayeredpane,Java,Swing,Drag And Drop,Jlayeredpane,我目前正在开发drag n drop应用程序,我很想知道JLayeredPane中发生了什么,我得到了一个特定的程序行为 交易如下: 我在默认的_层上放置了一个棋盘。 我还有一个棋子,我想在移动它时将其添加到DRAG_层 但我有一种恋物癖 我想用这条线 layeredPane.add(chessPiece, JLayeredPane.DRAG_LAYER); 仅在mouseDragged事件下 所以,当我这样做的时候,我的棋子在移动鼠标时消失了,并隐藏在棋盘后面(?!?) 当我将上述行更改为:

我目前正在开发drag n drop应用程序,我很想知道JLayeredPane中发生了什么,我得到了一个特定的程序行为

交易如下:

我在默认的_层上放置了一个棋盘。
我还有一个棋子,我想在移动它时将其添加到DRAG_层

但我有一种恋物癖

我想用这条线

layeredPane.add(chessPiece, JLayeredPane.DRAG_LAYER);
仅在mouseDragged事件下

所以,当我这样做的时候,我的棋子在移动鼠标时消失了,并隐藏在棋盘后面(?!?)

当我将上述行更改为:

layeredPane.add(chessPiece, JLayeredPane.DRAG_LAYER,0);
一切恢复正常


为什么会发生这种情况?

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


请注意,
add(组件comp、对象约束、int索引)
是由
java.awt.Container
实现的,而不是
javax.swing.JLayeredPane

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

由于DragLayer中只添加了一个组件,因此从理论上讲,使用哪种添加方法不会有什么区别。但是,由于DefaultLayer上还有一个组件,因此可能会有所不同。唯一确定的方法是查看源代码


然而,正如你在其他帖子中所建议的那样。此代码不应在mouseDragged()事件中执行。由于生成了多个拖动事件,因此继续将棋子“添加”到拖动布局是没有意义的。你所需要做的就是在鼠标移动时改变棋子的位置。这就是为什么mousePressed()事件用于将棋子添加到拖动层

我也使用了上述诊断,下面是发生的情况:

int number=layeredPane.getLayer(棋子)

int number3=layeredPane.getComponentCountInLayer(JLayeredPane.DRAG_LAYER)

拖动时,第一个始终返回数字400,这是拖动层的符号。 但是 另一个一开始返回1,但当我们拖动它时,它会变成零

这意味着至少在一段时间内,棋子实际上进入了拖曳层,然后脱落。 但如果你问窗格,就会发生这种情况

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

我在找JLayeredPane.java 但是直到现在都没有运气


Thanx提前…

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

注意:add(…)调用由JLayeredPane.ah实现的addImpl(…)。但是,如果您阅读文档,建议使用moveToFront/moveToBack和setLayer:“此序列(由java.awt.Container定义)与层编号序列相反。不过,通常您将使用moveToFront、moveToBack和setLayer。”我知道这两种方法之间的区别。正如您正确指出的,在第一种情况下,组件添加到容器的末端,在第二种情况下,组件添加到容器中的指定位置。但问题是,除了棋子,拖动层上没有其他东西。这正是问题所在。因此,我选择使用哪种方法并不重要。此外,您如何解释有时(拖动时)棋子似乎出现在棋盘后面的事实?以下是代码的链接: