Как вызвать setUndecorated() после того, как кадр становится видимым?
В моем приложении Swing мне нужна возможность переключаться между украшенным и не декорированным без повторного создания всего кадра. Однако API не позволяет мне называть setUndecorated()
после того, как кадр становится видимым.
Даже если я вызываю setVisible(false)
, isDisplayable()
по-прежнему возвращает true. API говорит, что единственный способ сделать не отображаемый фрейм - это воссоздать его. Однако я не хочу воссоздавать фрейм, чтобы отключить некоторые заголовки.
Я делаю полноэкранное приложение, которое можно переключать между полноэкранным и оконным режимами; Он должен иметь возможность переключаться при сохранении состояния и т.д.
Как это сделать после просмотра рамки?
Ответы
Ответ 1
Вы не можете. Это был мой опыт, когда я пытался достичь того же.
Однако, если у вас есть весь пользовательский интерфейс на одной панели, находящейся в вашем фрейме, вы можете создать новый фрейм и добавить эту панель в фрейм. Не так много работы.
Что-то вроде этого:
// 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 панель (и даже любой экземпляр компонента) может быть только в одном кадре за раз, поэтому, когда вы добавляете ее в новый фрейм, она сразу перестает находиться в старом фрейме.
Ответ 2
Вы пробовали позвонить Frame.dispose()
, а затем изменить его? Не пробовал сам, но это может сработать.
Если нет, то то, что вы можете сделать, - это иметь несущественную часть этого класса, причем только самые минимальные крючки на панели или панели самого высокого уровня обязательно, и просто переместите их в новый кадр. Все дети будут следовать.
Ответ 3
Посмотрите 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);
Хотя он в настоящее время тот же, он может измениться в будущем.
Ответ 4
вызов dispose()
освобождает ресурсы родного окна. то вы можете редактировать такие свойства, как unecorated и т.д. затем просто вызовите setVisible(true)
, чтобы воссоздать ресурсы окна, и все работает нормально (позиция и все составляющие не могут быть изменены)
dispose();
setUndecorated(true/false);
setVisible(true);
Ответ 5
Ну, вам понадобится другой экземпляр фрейма. Возможно, вы сможете перемещать содержимое своего фрейма без повторного создания. Ключевым моментом здесь является то, что ваш код не зависит от конкретного фрейма. В любом случае это базовая хорошая практика.
Ответ 6
Попробуйте:
dispose();
setUndecorated(true);
setVisible(true);
Проверьте это. Надеюсь, это поможет!
Ответ 7
Вот код, как сделать ALT + Enter входит в полноэкранный режим без режима бара и сворачивает с отображением панели заголовка и панели "Пуск":
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
}