Qual é a melhor maneira de lidar com contextos AWT gráficos?
Pergunta
Alguns usuários do nosso aplicativo Swing relataram artefatos estranhos que aparecem no visor. Isso varia de componentes não repintar-se corretamente por um segundo ou dois, certo até porções inteiras da aplicação que está sendo repintado como papel de parede de azulejos sobre as áreas da janela.
O aplicativo foi trabalhado por desenvolvedores de todos os níveis entre caras Java experientes para jovens rachaduras direita fora da universidade ao longo de cinco anos ou mais, e como seria de esperar, alguns dos códigos AWT é uma bagunça absoluta . Eu estou agora confrontados com a tarefa de tentar corrigir o máximo de maldade que eu puder ao longo dos próximos meses ou assim.
Alguns disto é fácil de lidar. Lidar com componentes apenas no segmento de eventos expedição, IO de forma assíncrona, tipo de coisa, e eu estou espero passar a mensagem para o resto da equipe.
O que eu gostaria de saber é a melhor maneira de lidar com contextos Gráficas, especialmente em um contexto paintComponent (). Eu vejo um monte de ...
public void paintComponent( Graphics g ) {
super.paintComponent( g );
Graphics2D gfx = (Graphics2D)g;
// ...Whole lotta drawing code...
}
É melhor prática para fazer isso?
public void paintComponent( Graphics g ) {
super.paintComponent( g );
Graphics2D gfx = (Graphics2D)g.create();
// ...Whole lotta drawing code...
gfx.dispose();
}
Se o parâmetro g vai ser reutilizado em outras tintas, então não preciso restaurá-lo para um estado bom, desfazer AffineTransforms, etc.?
Solução
De acordo com Filthy Rich Clients, você não deve alterar o objeto Graphics
passado para você (que suga como um API, IMO).
A maneira correta de lidar com isso é um pouco mais detalhado:
public void paintComponent(Graphics g1) {
super.paintComponent(g1);
final Graphics2D g = (Graphics2D)g1.create();
try {
// ...Whole lotta drawing code...
} finally {
g.dispose();
}
}
IIRC, na implementação Sun não importa se você não dispor de objetos "sub-gráficos". (Não citar-me sobre isso.)
Você pode querer delegar esse comentário pouco para outro objeto.
Outras dicas
Ouvi dizer que isso foi corrigido no jdk-1.6.12, mas não experimentá-lo.