Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 37
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    480

    Gestione tempo di attesa pagina web

    Ciao a tutti,
    vorrei gestire i tempi di attesa per la connessione ad una pagina web dalla mia applicazione in java.
    Dall'interno del software, faccio riferimento ad una pagina web e vorrei gestire i tempi di attesa relativi alla connessione, visualizzando GIF finchè non viene caricata l'immagine.
    C?è un modo per farlo ?

    Nella classe, in java,faccio riferimento alla pagina in questo modo:
    codice:
    String mapUrlFormat = ("https://maps.googleapis.com/maps/api/staticmap?....");
    URL mapUrl = new URL(String.format(mapUrlFormat));
    Icon img = new ImageIcon(mapUrl);
    mapHolder.setIcon(img);
    Grazie mille

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da roquentin Visualizza il messaggio
    vorrei gestire i tempi di attesa relativi alla connessione, visualizzando GIF finchè non viene caricata l'immagine.
    C?è un modo per farlo ?
    Sì è possibile. La tecnica è quella di implementare un Icon che fa da "proxy" per il ImageIcon da caricare, facendo disegnare "qualcos'altro" (testo o magari immagine) finché la vera immagine non è completamente caricata.

    L'esempio che conosco io è quello pubblicato sul libro "Head First Design Patterns" e descritto a partire dalla pag. 464.

    Il codice comunque si trova in rete: qui (è lo stesso che vedo sul libro cartaceo che ho) oppure qui (che mi pare pure migliorato su alcuni aspetti di sincronizzazione).

    Prendi quel codice solo come base, lo dovrai rimaneggiare un po', anche perché come segnaposto di attesa visualizza una scritta ... non una immagine. Ma il concetto comunque è quello ...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    480
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Sì è possibile. La tecnica è quella di implementare un Icon che fa da "proxy" per il ImageIcon da caricare, facendo disegnare "qualcos'altro" (testo o magari immagine) finché la vera immagine non è completamente caricata.

    L'esempio che conosco io è quello pubblicato sul libro "Head First Design Patterns" e descritto a partire dalla pag. 464.

    Il codice comunque si trova in rete: qui (è lo stesso che vedo sul libro cartaceo che ho) oppure qui (che mi pare pure migliorato su alcuni aspetti di sincronizzazione).

    Prendi quel codice solo come base, lo dovrai rimaneggiare un po', anche perché come segnaposto di attesa visualizza una scritta ... non una immagine. Ma il concetto comunque è quello ...
    Avrei fatto in questo modo:
    codice:
    Icon loading = new ImageIcon("src//immagini//loading.gif");
            mapHolder.setIcon(loading);
            System.out.println(loading);
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(8000); //Simula latenza di rete...
                        String mapUrlFormat = ("https://maps.googleapis.com/maps/api/staticmap?center=.......");
                        URL mapUrl = new URL(mapUrlFormat);
                        BufferedImage bimg = ImageIO.read(mapUrl);
                        Icon img = new ImageIcon(bimg);
                        mapHolder.setIcon(img);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    
                }
            }).start();
    In questo modo finchè non carica la mappa statica da googlemaps mi visualizza la gif.
    Però si presentano 2 problemi:
    1. Quando aprò il software viene caricata una immagine di una mappa di default, e quindi poi quando vado a selezionare una città da una JComboBox e vado a cliccare sul JButton "Cerca", va a caricarmi la nuova mappa centrata sulla città che ho selezionato sostituendomi quella di default. Utilizzando la gif, la mappa di default viene sostituita dalla gif finchè non viene caricata la nuova immagine ma io vorrei che la gif sia visibile al di sopra della immagine caricata di default finchè non viene caricata la nuova mappa.

    2. Una volta caricata la nuova immagine da googlemaps (centrata sulla città selezionata) la gif e quindi il thread resta in esecuzione.

    Come potrei risolvere questi problemi?

    Grazie

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    480
    Ho risolto il punto 1. ponendo la gif in una JLabel e ponendola sopra la JLabel che contiene l'immagine di default.

    Resta il problema del punto 2: come faccio ad interrompere il thread quando la nuova immagine di mappa mi viene caricata e visualizzata?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da roquentin Visualizza il messaggio
    Resta il problema del punto 2: come faccio ad interrompere il thread quando la nuova immagine di mappa mi viene caricata e visualizzata?
    Quando ImageIO.read ha terminato, hai creato ImageIcon e l'hai settato .... il run() termina.

    Scusa ma l'esempio di Icon di proxy l'hai visto??

    P.S. Ah, il tuo codice non è nemmeno correttissimo al 100%, stai aggiornando il componente mapHolder nel contesto di un thread che non è il EDT.
    Ultima modifica di andbin; 04-04-2015 a 16:40
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    480
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Quando ImageIO.read ha terminato, hai creato ImageIcon e l'hai settato .... il run() termina.
    Faccio questo:
    codice:
    BufferedImage bimg = ImageIO.read(mapUrl);
                        Icon img = new ImageIcon(bimg);
                        mapHolder.setIcon(img);
    ma il run() continua..

    Quote Originariamente inviata da andbin Visualizza il messaggio
    Scusa ma l'esempio di Icon di proxy l'hai visto??
    Si , l'ho visto ed ho anche cercato di provarlo ma non riuscivo a capire quale dei miei parametri passare al metodo:
    codice:
     public void paintIcon(final Component c, Graphics g, int x, int y) {
    ...
    Component c e Graphics g, cosa sono? cosa devo passargli ?


    P.S. Ah, il tuo codice non è nemmeno correttissimo al 100%, stai aggiornando il componente mapHolder nel contesto di un thread che non è il EDT.[/QUOTE]

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    480
    Ho provato il metodo da te consigliato, apportando delle modifiche:
    codice:
    import java.net.*;
    import javax.swing.*;
    
    public class ImageProxy  {
    
        volatile ImageIcon imageIcon;
        final URL imageURL;
        Thread retrievalThread;
        boolean retrieving = false;
    
        public ImageProxy(URL url) {
            imageURL = url;
        }
    
        public int getIconWidth() {
            if (imageIcon != null) {
                return imageIcon.getIconWidth();
            } else {
                return 800;
            }
        }
    
        public int getIconHeight() {
            if (imageIcon != null) {
                return imageIcon.getIconHeight();
            } else {
                return 600;
            }
        }
    
        synchronized void setImageIcon(ImageIcon imageIcon) {
            this.imageIcon = imageIcon;
        }
    
        public void paintIcon(final JLabel c, JLabel g) {
            if (imageIcon != null) {
                imageIcon.setImage(null);
            } else {
                Icon loading = new ImageIcon("src//immagini//loading.gif");
                g.setIcon(loading);
                System.out.println(retrieving);
                while (!retrieving) {
                    retrieving = true;
                    System.out.println(retrieving);
                    retrievalThread = new Thread(new Runnable() {
                        public void run() {
                            try {
                                setImageIcon(new ImageIcon(imageURL, ""));
                                System.out.println(imageURL);
                                c.setIcon(imageIcon);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    });
                    retrievalThread.start();
                }
            }
        }
    }
    richiamandolo così:

    codice:
    String mapUrlFormat = ("https://maps.googleapis.com/maps/api/staticmap?center....");
                URL mapUrl = new URL(mapUrlFormat);
                ImageProxy loadingProxy;
                loadingProxy = new ImageProxy(mapUrl);
                loadingProxy.paintIcon(mapHolder, loadingGif);
    ma il thread non riesco a fermarlo quando viene caricata la nuova mappa...non so come fare!!

    Dove sbaglio ?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Purtroppo hai stravolto completamente quell'esempio e probabilmente senza nemmeno comprendere il concetto del proxy e il senso concettuale del "ImageProxy implements Icon".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    480
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Purtroppo hai stravolto completamente quell'esempio e probabilmente senza nemmeno comprendere il concetto del proxy e il senso concettuale del "ImageProxy implements Icon".
    Ho solo provato, non risucivo a capire i parametri da passare al metodo paintIcon, cioè Component e Graphic, ed ho provato in quest'altro modo ma non va ugualmente.
    Mi potresti spiegare che perametri devo passargli qui:
    codice:
    public void paintIcon (final Component c, Graphics g, int x, int y) {
    ...
    ???

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da roquentin Visualizza il messaggio
    Mi potresti spiegare che perametri devo passargli qui:
    codice:
    public void paintIcon (final Component c, Graphics g, int x, int y) {
    ...
    ???
    Ma allora non hai ancora compreso cosa è un Icon e perché ImageProxy implements Icon ....

    ImageProxy implementa Icon, ovvero è una "icona" come intesa da Swing e da tutti i componenti che sono in grado di visualizzare icone (JLabel, JButton e altri). Il suo metodo:

    public void paintIcon(final Component c, Graphics g, int x, int y)

    NON sei tu che lo devi invocare! È il framework che lo invoca.

    Tu dovresti usare ImageProxy creandone una istanza e assegnandola ad un componente che visualizza una icona. Riprendendo dal tuo codice:

    codice:
    String mapUrlFormat = ("https://maps.googleapis.com/maps/api/staticmap?center=.......");
    URL mapUrl = new URL(mapUrlFormat);
    Icon img = new ImageProxy(mapUrl);    // <---- tu crei un ImageProxy !!!
    mapHolder.setIcon(img);

    Finché la immagine da mapUrl non è completamente caricata, il paintIcon di ImageProxy passa nel else

    codice:
    		} else {
    			g.drawString("Loading CD cover, please wait...", x+300, y+190);
    			if (!retrieving) {

    e disegna un testo (tu dovrai disegnare una immagine ... quindi il codice un po' lo devi rimaneggiare, è ovvio) e solo 1 volta fa partire un thread che carica la immagine finale. Quando essa sarà finalmente caricata, allora il paintIcon di ImageProxy passa nel primo ramo del if:

    codice:
    		if (imageIcon != null) {
    			imageIcon.paintIcon(c, g, x, y);   // <--- disegna la immagine caricata

    In pratica quando la immagine finale è caricata, il paintIcon di ImageProxy fa semplicemente e solo più da "passacarte" verso il paintIcon della "vera" immagine. Prima invece si attivava lui per disegnare "qualcosa" come segnaposto.

    Ti è chiaro ora? Perché se non ti è chiaro te lo dovrò rispiegare pure domani a pasquetta ..
    Ultima modifica di andbin; 05-04-2015 a 17:55
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.