Как вызвать setUndecorated() после того, как кадр стал видимым?

StackOverflow https://stackoverflow.com/questions/875132

  •  22-08-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Что-то вроде этого:

// 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 панель (да и любой экземпляр компонента) может одновременно находиться только в одном кадре, поэтому, когда вы добавляете ее в новый кадр, она сразу же перестает находиться в старом кадре.

Другие советы

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

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

Посмотри на 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) сильно мешает своевременному расположению(), поскольку они оба полагаются на несколько собственных событий операционной системы, которые теряются, если окно не будет отображаться в эту долю секунды.

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

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();

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

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

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

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

dispose();
setUndecorated(true/false);
setVisible(true);

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

Пытаться:

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

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

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

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
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top