Search code examples
javaswingfullscreen

How to call setUndecorated() after a frame is made visible?


In my Swing application, I want the ability to switch between decorated and undecorated without recreating the entire frame. However, the API doesn't let me call setUndecorated() after the frame is made visible.

Even if i call setVisible(false), isDisplayable() still returns true. The API says the only way to make a frame not-displayable is to re-create it. However, I don't want to recreate the frame just to switch off some title bars.

I am making a full-screenable application that can be switched between fullscreen and windowed modes; It should be able to switch while maintaining the state, etc.

How do I do this after a frame is visible?.


Solution

  • You can't. That's been my experience when I tried to achieve the same.

    However if you have your entire UI in one panel which is in your frame, you can create a new frame and add that panel to the frame. Not so much work.

    Something like this:

    // to start with
    JPanel myUI = createUIPanel();
    JFrame frame = new JFrame();
    frame.add(myUI);
    
    // .. and later ...
    
    JFrame newFrame = new JFrame();
    newFrame.setUndecorated();
    newFrame.add(myUI);
    

    In Swing a panel (and indeed any instance of a component) can only be in one frame at a time, so when you add it to a new frame, it immediately ceases to be in the old frame.