Estou montando um aplicativo Swing, onde geralmente desejo substituir o conteúdo de um JPanel. Para fazer isso, estou ligando removeAll()
, adicionando meu novo conteúdo e ligando revalidate()
.
No entanto, estou descobrindo que o conteúdo antigo ainda é realmente visível (embora obscurecido pelo novo conteúdo). Se eu adicionar uma chamada repaint()
além de revalidate()
, ela funcionará conforme o esperado.
Tenho certeza de que em outras ocasiões já experimentei que basta ligar revalidate()
.
Então, basicamente, minha pergunta é: devo chamar as duas funções? Caso contrário, quando devo chamar cada uma delas?
Respostas:
Você precisa ligar
repaint()
erevalidate()
. O primeiro diz a Swing que uma área da janela está suja (o que é necessário para apagar a imagem das crianças removidas porremoveAll()
); o último diz ao gerente de layout para recalcular o layout (o que é necessário ao adicionar componentes). Isso deve fazer com que os filhos do painel repintem, mas pode não fazer com que o próprio painel faça isso (consulte isso na lista de acionadores de repintar).Em uma observação mais geral: em vez de reutilizar o painel original, recomendo criar um novo painel e trocá-los no pai.
fonte
Sempre que você remove () ou removeAll (), deve ligar para
depois de concluir a adição () dos novos componentes.
Chamar validate () ou revalidate () é obrigatório quando você remove () - consulte os javadocs relevantes.
Meus próprios testes indicam que repaint () também é necessário. Não sei exatamente o porquê.
fonte
revalidate
é chamado em um contêiner assim que novos componentes são adicionados ou antigos são removidos. esta chamada é uma instrução para solicitar ao gerente de layout que redefinir com base na nova lista de componentes.revalidate
acionará uma chamada para repintar o que o componente considera 'regiões sujas'. Obviamente, nem todas as regiões do seuJPanel
são consideradas sujas peloRepaintManager
.repaint
é usado para dizer a um componente para repintar a si próprio. Geralmente, é necessário chamar isso para limpar condições como a sua.fonte
revalidate()
basta solicitar o layout do contêiner, quando você experimenta simplesmente chamarrevalidate()
obras, isso pode ser causado pela atualização dos limites dos componentes filhos, acionarepaint()
quando seus limites são alterados durante o re-layout. No caso mencionado, apenas o componente removido e nenhum limite de componente é alterado; nesse caso, nenhumrepaint()
é acionado "acidentalmente" .fonte
sim, você precisa chamar repaint (); revalidar(); quando você chama removeAll (), é necessário chamar repintar () e revalidar ()
fonte