Como chamar setUndecorated () depois de uma armação é feita visível?
-
22-08-2019 - |
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?.
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
}