Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

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?.

like image 447
Lucky Avatar asked May 17 '09 18:05

Lucky


People also ask

How do you make a JFrame visible?

When you create a JFrame object, by default, it is not visible. You need to call its setVisible(boolean visible) method to make it visible. If you pass true to this method, the JFrame is made visible, and if you pass false, it is made invisible. new JFrame("Simplest Swing").


2 Answers

Have you tried calling Frame.dispose() and then changing it? Haven't tried it myself, but it might work.

If not, then what you can do is have the frame an inconsequential part of the class, with only the most minimal hooks to the highest level panel or panels necessarily, and just move those to the new frame. All the children will follow.

like image 100
Yishai Avatar answered Oct 22 '22 14:10

Yishai


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.

like image 27
Steve McLeod Avatar answered Oct 22 '22 13:10

Steve McLeod