Pergunta

Nós temos um Java Applet construído usando AWT. Esta aplicação permite-lhe seleccionar imagens do seu disco rígido e enviá-los para um servidor. O applet inclui uma lista de rolagem de fotos, que funciona bem em Windows, Linux e Mac OS X 10.5. Lançamos este applet via Java Web Start ou dentro de uma página web.

Nosso applet não se comportar corretamente no Mac OS X 10.4, independentemente da versão do Java (1.4 ou 1.5). Você pode encontrar uma imagem do comportamento incorreto, ao rolar, aqui:

http://www.lavablast.com/tmp/ui_error.png

Em termos simples, por vezes, ao rolar as imagens acabam sobrepondo o cabeçalho ou rodapé da aplicação. Este comportamento não ocorre em outras plataformas. No Mac OS X 10.4, ele mostra as fotos no local incorreto quando rolagem, o que não seria tão ruim se refrescou a tela depois de pintar a imagem naquele local. No entanto, não parece que a aplicação sabe que pintou-o de forma incorreta e, portanto, não se refrescar.

Se a janela é minimizada, ou mesmo redimensionada movido, a aplicação é actualizada e os elementos posicionados de forma incorrecta desaparecer e a aplicação é retomada normalmente. Passei algum tempo tentando forçar uma atualização da imagem de fundo, sem sucesso. (A redesenhar a imagem diretamente, repintar todas as crianças de alguns painéis, etc.) Assim, eu estou procurando alguma dica que iria me ajudar a resolver este problema no Mac OS X 10.4 ou, no pior caso, basta simular um applet completo refrescar.

Até recentemente, tudo era compatível com Java 1.1, mas isso mudou em alguns locais que agora exigem 1.4. Eu não sinto essas mudanças criaram o problema, eu estou apenas fornecendo isso como informação extra. Se você estiver interessado em detalhes de implementação do painel de rolagem, vou investigar, mas eu estou supondo que este é um bug plataforma comum para que soluções alternativas devem ser conhecidas.

Para replicar o problema, abra a seguinte aplicação Java Web Start: http://www.lavablast.com/tmp/opal-webstart.php. jnlp

Escolha uma pasta que contenha muitas imagens e brincar com a barra de rolagem. Em algum ponto (rapidamente), você deve obter o problema de atualização.

Edit: Eu segui a primeira sugestão aqui e substituídos todos os meus controles que imagens de fundo recurso com um equivalente de Swing e o problema ainda está lá. (Além disso, existem inúmeras outras correções que eu precisaria fazer para fazer uma mudança completa). Quaisquer outras ideias? Uma linha simples de código que forças uma atualização completa seria ótimo:)

Edit2: O thread principal cria os painéis e lança X threads. Usando um padrão observador / notificador, os tópicos completos e notificar o controle principal, que adiciona um painel para a página. Isto é feito através de um EventQueue.invokeLater que, se não me engano, deve ser executado no segmento direito. A questão é a sua mais grave quando rolagem, mesmo se não segmentos extras estão funcionando (como durante o carregamento).

Foi útil?

Solução

Ele se parece com mistura leve (geralmente Swing) e componentes pesados ??(AWT) juntos. Movendo-se para balançar você precisa substituir a cada última AWT equivalentes balanço de componentes. (Dica:. Evitar import java.awt *)

Threading é muitas vezes um problema potencial para bugs estranhos. componentes Swing deve ser sempre usado na EDT (uso java.awt.EventQueue.invokeLater). AWT é thread-safe é teoria, mas não na prática -. Também restringir o uso do EDT

Outras dicas

Como você já requerem Java 1.4 você deve considerar algumas pequenas mudanças para levar em GUI uso SWING em vez disso, ele resolveu nossos problemas de atualização Applet com AWT. (Mac, Linux etc)

Se você tiver, por exemplo, Painel, você precisa substituí-lo com JPanel etc.

Você precisa isto:

import javax.swing.*;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top