Подтвердить что ты не робот

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

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

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

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

Как это сделать после просмотра рамки?

4b9b3361

Ответ 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
}