Domanda

Abbiamo un applet Java creato usando AWT. Questa applet ti consente di selezionare le immagini dal tuo disco rigido e caricarle su un server. L'applet include un elenco scorrevole di immagini, che funziona perfettamente in Windows, Linux e Mac OS X 10.5. Lanciamo questa applet tramite Java Web Start o all'interno di una pagina Web.

La nostra applet non si comporta correttamente in Mac OS X 10.4, indipendentemente dalla versione di Java (1.4 o 1.5). Puoi trovare uno screenshot del comportamento errato, durante lo scorrimento, qui:

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

In poche parole, a volte quando si scorre le immagini finiscono per sovrapporsi all'intestazione o al piè di pagina dell'applicazione. Questo comportamento non si verifica su altre piattaforme. Su Mac OS X 10.4, mostra le immagini nella posizione errata durante lo scorrimento, il che non sarebbe così male se aggiornasse lo schermo dopo aver dipinto l'immagine in quella posizione. Tuttavia, non sembra che l'applicazione sappia che l'ha dipinta in modo errato e quindi non si aggiorna.

Se la finestra viene ridotta a icona, ridimensionata o addirittura spostata, l'applicazione viene aggiornata e gli elementi posizionati in modo errato scompaiono e l'applicazione riprende normalmente. Ho trascorso un bel po 'di tempo cercando di forzare un aggiornamento dell'immagine di sfondo senza successo. (ridipingere l'immagine direttamente, ridipingere tutti i bambini di alcuni pannelli, ecc.) Quindi, sto cercando eventuali suggerimenti che mi aiutino a risolvere questo problema in Mac OS X 10.4 o, nel peggiore dei casi, semplicemente simulare un applet completo ricaricare.

Fino a poco tempo fa, tutto era compatibile con Java 1.1 ma questo è cambiato in alcune posizioni che ora richiedono 1.4. Non credo che questi cambiamenti abbiano creato il problema, sto solo fornendo questo come ulteriore informazione. Se sei interessato ai dettagli di implementazione del pannello di scorrimento, esaminerò, ma presumo che si tratti di un bug della piattaforma comune per il quale è necessario conoscere soluzioni alternative.

Per replicare il problema, aprire la seguente applicazione Java Web Start: http://www.lavablast.com/tmp/opal-webstart.php. jnlp

Seleziona una cartella contenente molte immagini e gioca con la barra di scorrimento. Ad un certo punto (abbastanza rapidamente), dovresti ottenere il problema di aggiornamento.

Modifica: ho seguito il primo suggerimento qui e ho sostituito tutti i miei controlli che presentano immagini di sfondo con un equivalente Swing e il problema è ancora presente. (Inoltre, ci sono numerose altre correzioni che dovrei fare per fare una modifica completa). Altre idee? Una semplice riga di codice che impone un aggiornamento completo sarebbe ottima :)

Modifica2: il thread principale crea i pannelli e avvia i thread X. Utilizzando un modello osservatore / notificatore, i thread vengono completati e notificati al controllo principale, che aggiunge un pannello alla pagina. Questo viene fatto tramite un EventQueue.invokeLater che, a meno che non mi sbagli, dovrebbe essere eseguito sul thread giusto. Il problema è più grave durante lo scorrimento anche se non sono in esecuzione thread aggiuntivi (come durante il caricamento).

È stato utile?

Soluzione

Sembra mescolare insieme componenti leggeri (solitamente Swing) e pesanti (AWT). Passando a Swing devi sostituire tutti gli ultimi componenti AWT Swing equivalenti (suggerimento: evitare import java.awt. *).

Il threading è spesso un potenziale problema per bug dispari. I componenti Swing devono essere sempre utilizzati sull'EDT (utilizzare java.awt.EventQueue.invokeLater ). AWT è thread-safe è la teoria, ma non in pratica - limita anche l'utilizzo all'EDT.

Altri suggerimenti

Dato che hai già bisogno di Java 1.4, dovresti prendere in considerazione alcune piccole modifiche da utilizzare invece con la GUI di SWING, che ha risolto i problemi di aggiornamento dell'applet con AWT. (Mac, Linux ecc.)

Se hai ad es. Pannello, è necessario sostituirlo con JPanel ecc.

Ti serve questo:

import javax.swing.*;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top