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.?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top