Erro de renderização de transparência do Java
Atualmente estou desenvolvendo um programa em Java estilo quiosque para exibir tempo, tempo, previsão, etc. Aqui está uma imagem do que o programadevemos parece (screenshot tirada antes da hora atualizada)
As várias seções são criadas como JPanels com opaintComponent()
método substituído. Eles desenham um cabeçalho gradiente e um fundo semitransparente. No entanto, quando altero o conteúdo de um desses painéis, o conteúdo anterior é deixado para trás, em vez de ser removido. Um exemplo é mostrado abaixo:
Como você pode ver, quando o tempo mudou de 11:51 para 11:52, os números se sobrepuseram, e o plano de fundo ficou mais claro (porque o plano de fundo semitransparente foi redesenhado sobre ele)
O erro gráficoO que devo fazer para evitar essa sobreposição? Por fim, prefiro não ter que redesenhar toda a tela quando um painel individual atualizar seu conteúdo. Eu preferiria apenas redesenhar essa seção em particular. Seria fácil repintar o fundo e depois todos os componentes.
AtualizarVárias respostas envolvem limpar a área a ser desenhada. Se eu usog.clear()
ouAlphaComposite.CLEAR
apaga a imagem de fundo. Isso pode ser visto na imagem a seguir. Talvez, se eu pudesse copiar o plano de fundo antes de limpar a área, eu pudesse repintar essa seção do plano de fundo e, em seguida, sobrepor as outras imagens adequadamente. Pensamentos?
Foi enviada uma resposta que mostra um exemplo de trabalho completo de um temporizador colocado sobre um painel transparente e um fundo. Isso é muito útil, no entanto, não estou pintando meus sub-componentes manualmente. A hora, os ícones do tempo e as temperaturas são todos os JLabels dispostos sobre o painel semitransparente. Eu preferiria não ter que pintar os componentes individuais manualmente.