将一个组件放在JPanel上(Java)

在VB中,您可以使用zOrder 。 在.Net中,它是.SetChildIndex

在你问之前,在这种情况下我没有使用布局管理器。 如果您有两个组件在彼此之上,如何在显示后更改订单?

由于空间不足,我有一个按钮略微重叠在另一个组件(标签)的顶部。 我在按钮之前将JLabel添加到表单中,当表单加载时,它看起来很好。 然而,当用户点击按钮时,JLabel会向后移动,使其中的一大块消失。 有没有办法让它保持在前面? 我尝试将label.grabFocus()放在按钮的ActionListener中,但它不起作用。

当组件在面板上重叠时,您需要告诉面板,以便确保它在适当的ZOrder中重新绘制组件:

您可以通过覆盖JPanel的isOptimizedDrawingEnabled()方法来返回false

您还可以使用JFrame的LayeredPane。 使用JFrame.getLayeredPane(),您可以获得正在使用的窗格的引用。

LayeredPane的add方法最多有2个额外的int参数。 第一个指定了你要添加的组件的层,第二个指定了该层内的顺序。

您可以在http://download.oracle.com/javase/tutorial/uiswing/components/rootpane.html#layeredpane找到更多信息。

首先,这似乎是一个糟糕的设计。 虽然label.repaint()有效,但它不是你应该这样做的。 您没有明确指定这些组件如何相互重叠。 为此,更好的方法是分层窗格。 java的zOrder对应物是Layered Pane。 此链接应该可以帮助您: http : //download.oracle.com/javase/tutorial/uiswing/components/layeredpane.html

告诉我你是否有任何问题。

我不确定,但会重新画作吗? 如果它有点黑客,也许别人可以找到更好的方法……

使重叠组件以正确的方式运行并不是那么明显。 最受支持的方法是在面板中使用OverlayLayout。