开发者

Bring a component on a JPanel to front (Java)

In VB, you can use zOrder. In .Net, it's .SetChildIndex.

Before you ask, no I'm not using a layout manager in this case. If you have two components on top of each other, how do you change the order after they have already been displayed?

I have a button that slightly overlaps on top 开发者_运维技巧of another component (label), due to the lack of space. I added the JLabel to the form before the button, and when the form loads, it looks fine. However when the user clicks the button, the JLabel goes to the back, making a chunk of it disappear. Is there a way to keep it to the front? I have tried putting label.grabFocus() in the button's ActionListener but it did not work.


By default Swing assumes components don't overlap so components can be repainted more efficiently. That is when you change a property on a component, only that component needs to be repainted.

When components overlap on the panel then you need to tell the panel so it can make sure all components are repainted in their proper ZOrder:

You do this by overriding the isOptimizedDrawingEnabled() method of the JPanel to return false.

JPanel panel = new JPanel()
{
    @Override
    public boolean isOptimizedDrawingEnabled()
    {
        return false;
    }
}


you can also use the LayeredPane of your JFrame. With JFrame.getLayeredPane() you get a reference of the pane in use.

the add method of LayeredPane has up to 2 additional int parameters. the first specified the Layer of the component you'd add and the second contols the order inside this layer.

You can find more infos at http://download.oracle.com/javase/tutorial/uiswing/components/rootpane.html#layeredpane


Firstly, this appears to be a poor design. Though label.repaint() works, its not the way you should do it. You are not specifying explicitly how these components overlap one on the other. For that a better approach would be Layered Panes. The java's counterpart for zOrder is Layered Pane. This link should help you: http://download.oracle.com/javase/tutorial/uiswing/components/layeredpane.html

just tell me if you have any problem.


I'm not sure, but would repaint work? bit of a hack if it does, maybe someone else could find a better way...


It isn't that obvious to make overlapping components behave in the right way. The most supported way is to use an OverlayLayout within your panel.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜