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

时间:2011-08-10 12:01:46

标签: java swing focus actionlistener

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

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

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

5 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:6)

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

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

您可以在http://download.oracle.com/javase/tutorial/uiswing/components/rootpane.html#layeredpane

找到更多信息

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

我不确定,但会重新画作吗?如果有的话,或许其他人可以找到更好的方式......

答案 4 :(得分:1)

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