Pergunta

Na minha aplicação Swing, eu quero a capacidade de alternar entre decorados e undecorated sem recriar todo o quadro. No entanto, a API não deixe-me chamar setUndecorated() após o quadro torna-se visível.

Mesmo que eu chamo setVisible(false), isDisplayable() ainda retorna verdadeiro. A API diz que a única maneira de fazer um quadro não-exibível é recriá-lo. No entanto, eu não quero recriar o quadro apenas para desligar algumas barras de título.

Estou fazendo uma aplicação full-pesquis�el que pode ser alternado entre tela cheia e modos de janelas; Ele deve ser capaz de mudar, mantendo o estado, etc.

Como posso fazer isso depois de um quadro é visível?.

Foi útil?

Solução

Você não pode. Essa tem sido a minha experiência quando eu tentei conseguir o mesmo.

No entanto, se você tem todo o seu UI em um painel que está em seu quadro, você pode criar um novo quadro e adicionar o painel na armação. Não tanto trabalho.

Algo parecido com isto:

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

// .. and later ...

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

No balanço de um painel (e na verdade qualquer instância de um componente) só pode estar em um quadro de cada vez, então quando você adicioná-lo para um novo quadro, ele imediatamente deixa de ser no antigo quadro.

Outras dicas

Você tentou chamar Frame.dispose() e depois mudá-lo? Não tentei isso sozinho, mas ele poderia funcionar.

Se não, então o que você pode fazer é ter a estrutura de uma parte insignificante da classe, com apenas o mais ganchos mínimas para o painel de nível mais alto ou painéis necessariamente, e basta mover os para o novo quadro. Todas as crianças vão seguir.

Tenha um olhar em https://tvbrowser.svn.sourceforge.net/svnroot/tvbrowser/trunk/tvbrowser/src/tvbrowser/ui/mainframe/MainFrame.java

No Método switchFullscreenMode():

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

Na verdade, há muito mais coisas acontecendo para ocultar vários sidepanels que reaparecem se o mouse toca os lados.

Além disso, note que você deve definir explicitamente os limites. interfere Window.setExtendedState(MAXIMIZED_BOTH) mal na vizinhança oportuna de dispose (), porque ambos dependem de vários eventos nativos do sistema operacional, que são perdidos, caso a janela não ser visualizável naquela fração de segundo.

Eu não recomendo tomar a tela padrão diretamente:

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();

e, em vez usar a tela, o JFrame está atualmente em:

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

Embora seja atualmente o mesmo, pode mudar no futuro.

chamando dispose() libera os recursos de janelas nativas. em seguida, você pode editar as propriedades como undecorated e assim por diante. em seguida, basta chamar setVisible(true) para recriar os recursos da janela e tudo funciona bem (a posição e todas as compoenents ganhou `t ser alterado)

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

Bem, você vai precisar instância quadro diferente. Você pode ser capaz de mover o conteúdo do seu quadro mais sem recriar isso. A chave aqui é fazer com que seu código não ser dependente de um quadro específico. Esta é uma boa prática básica em qualquer caso.

Tente:

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

Confira. Espero que ele vai ajudar !!

Aqui está um código em como fazer ALT + Enter entra em tela cheia, sem o modo de bar e Minimizar com mostrar a barra de título ea barra de início:

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
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top