在VB中,您可以使用zOrder
。
在.Net中,它是.SetChildIndex
。
在你问之前,在这种情况下,我没有使用布局管理器。如果您有两个组件在彼此之上,那么如何在显示后更改订单?
由于空间不足,我有一个按钮,在另一个组件(标签)的顶部略微重叠。我在按钮之前将JLabel添加到表单中,当表单加载时,它看起来很好。然而,当用户点击按钮时,JLabel会向后移动,使其中的一大块消失。有没有办法让它保持在前面?我尝试将label.grabFocus()
放在按钮的ActionListener中,但它不起作用。
答案 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。