Как вызвать setUndecorated () после того, как кадр сделан видимым? - PullRequest
19 голосов
/ 17 мая 2009

В моем приложении Swing мне нужна возможность переключаться между декорированным и неокрашенным без воссоздания всего кадра. Однако API не позволяет мне вызывать setUndecorated() после того, как кадр становится видимым.

Даже если я позвоню setVisible(false), isDisplayable() все равно вернет истину. API говорит, что единственный способ сделать кадр не отображаемым - это воссоздать его. Тем не менее, я не хочу воссоздавать кадр, просто чтобы отключить некоторые заголовки.

Я делаю полноэкранное приложение, которое можно переключать между полноэкранным и оконным режимами; Должен иметь возможность переключаться при сохранении состояния и т. Д.

Как мне сделать это после того, как рамка видна?.

Ответы [ 7 ]

24 голосов
/ 17 мая 2009

Вы пытались позвонить Frame.dispose() и затем изменить его? Сам не пробовал, но это может сработать.

Если нет, то то, что вы можете сделать, это сделать рамку несущественной частью класса, с необходимыми только самыми минимальными крючками для панели или панелей самого высокого уровня, и просто переместить их в новый кадр. Все дети будут следовать.

17 голосов
/ 18 мая 2009

Вы не можете. Это был мой опыт, когда я пытался достичь того же.

Однако, если у вас есть весь пользовательский интерфейс на одной панели, которая находится в вашем фрейме, вы можете создать новый фрейм и добавить эту панель в фрейм. Не так много работы.

Примерно так:

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

// .. and later ...

JFrame newFrame = new JFrame();
newFrame.setUndecorated();
newFrame.add(myUI);

В Swing панель (и фактически любой экземпляр компонента) может находиться только в одном кадре за раз, поэтому, когда вы добавляете его в новый кадр, он сразу перестает быть в старом кадре.

13 голосов
/ 30 июля 2009

Посмотрите на https://tvbrowser.svn.sourceforge.net/svnroot/tvbrowser/trunk/tvbrowser/src/tvbrowser/ui/mainframe/MainFrame.java

В методе switchFullscreenMode():

dispose();
...
setFullScreenWindow(...);
setUndecorated(true/false);
setBounds(mXPos, mYPos, mWidth, mHeight);
...
setVisible(true);

На самом деле происходит гораздо больше вещей, скрывающих различные боковые панели, которые появляются, если мышь касается боковых сторон.

Также обратите внимание, что вы должны явно установить границы. Window.setExtendedState(MAXIMIZED_BOTH) плохо вмешивается в своевременную близость к dispose (), потому что они оба полагаются на множество собственных событий операционной системы, которые теряются, если окно не будет отображаться в эти доли секунды.

Я не рекомендую использовать экран по умолчанию напрямую:

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();

и вместо этого используйте экран, ваш JFrame в данный момент включен:

setBounds(getGraphicsConfiguration().getBounds());
getGraphicsConfiguration().getDevice().setFullScreenWindow(this);

Хотя в настоящее время оно такое же, в будущем оно может измениться.

11 голосов
/ 05 декабря 2012

вызов dispose() освобождает ресурсы собственного окна. затем вы можете редактировать свойства, такие как неокрашенные и так далее. затем просто позвоните setVisible(true), чтобы воссоздать ресурсы окна, и все работает нормально (положение и все компоненты не изменятся)

dispose();
setUndecorated(true/false);
setVisible(true);
2 голосов
/ 12 декабря 2016

Попробуйте:

dispose();
setUndecorated(true);
setVisible(true);

Проверьте это. Надеюсь, это поможет !!

2 голосов
/ 17 мая 2009

Ну, вам понадобится другой экземпляр кадра. Возможно, вы сможете переместить содержимое вашего фрейма, не создавая его заново. Ключевым моментом здесь является то, чтобы ваш код не зависел от конкретного фрейма. В любом случае это базовая хорошая практика.

1 голос
/ 31 марта 2014

Вот код того, как сделать ALT + Ввод входит в полноэкранный режим без режима панели и свернуть с отображением строки заголовка и панели запуска:

public class myTest extends JFrame{
 //Your codes...
     //if "ALT" key on hold and "Enter" key pressed with it
     if (evt.isAltDown() && evt.getKeyCode() == evt.VK_ENTER) {    
         //if the JFrame has Title bar
         if (isUndecorated()) {
             //this will dispose your JFrame
             dispose();
             //here to set it with no Title bar
             setUndecorated(false);
             pack();
             setLocationRelativeTo(null);
             //as you dispose your JFrame, you have to remake it Visible..
             setVisible(true);
          } else {
             dispose();
             setUndecorated(true);
             setExtendedState(MAXIMIZED_BOTH);
             setVisible(true);
        }
    }
//your codes
}
...