Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    refresh backgroud immagine JDesktopPane

    Salve ragazzi,
    ho un problema che mi sta facendo arrovellare il cervello.
    Sto sviluppando un sistema che gestisce risultati sportivi in Java.

    Ho realizzato un JDesktopFrame con un barra superiore JmenuBar che gestisce l'apertura di finestre le JInternalFrame.

    Ho applicato al JDesktopFrame un'immagine di sfondo tramite il metodo Paint

    codice:
     
    public void paint(Graphics g) {     		
    super.paint(g);     		
    g.drawImage(backImage,60,60,desktop);     
    }
    Ora il mio problema è che all'apertura delle finestre oppure al calar del menù della JmenuBar questa immagine di background ovviamente viene x così dire deturpata lasciando bianco lo spazio occupato precedentemente...

    le ho provate tutte...
    ho provato ad implementare la mouseListener così al click del mouse creo la chiamata al
    gui.repaint() ma funziona solo se clicco sul desktop frame e non sulle altre finestre.

    Ho provato ad applicare questa funzione agli eventi delle JinternalFrame col risultato che facendo il repaint "scompare la JinternalFrame da poco creata.

    ho provato con un timerTask a fare il refresh ogni 200 ms ma crea lo stesso effetto di prima con in più uno sfarfallio dell'immagine dovuto al refresh e tante altre prove sempre col solito risultato.


    cosi richiamo l'immagine inserita nel costruttore:
    codice:
    backImage = new ImageIcon(this.getClass().getResource("img/sfondo.gif")).getImage();
    e faccio il paint con il metodo postato prima.


    Potete darmi qualche idea o magari c'è qualche metodo che evita questo problema qui? :master:
    Qualunque soluzione o consiglio è ben accetto
    Grazie
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Innanzitutto nei componenti Swing il metodo che rappresenta il "contesto" di disegno è:

    protected void paintComponent(Graphics).

    C'è anche paint(Graphics) ovviamente, perché è il punto principale di "ingresso" per il painting. Ma è più "a monte" di paintComponent (se vuoi dettagli, qui).
    Nei componenti Swing fare l'override di paint() è tecnicamente possibile ma sarebbe bene farlo solo se si conosce esattamente cosa succede.

    Poi un'altra cosa:

    g.drawImage(backImage,60,60,desktop);

    desktop cosa è?? Generalmente in quel parametro si passa o null o this (per indicare questo componente). Il quarto parametro è l'Observer, che viene notificato man mano che la immagine si completa o si aggiorna. Serve più che altro quando la immagine viene caricata in modo asincrono con il Toolkit (nota: ImageIcon usa il Toolkit per il caricamento) e magari è pure una GIF "animata" che si aggiorna di continuo.

    Se fai tutto corretto come fasi di disegno, devi sapere che non c'è alcun bisogno che tu faccia strani e improbabili truschini tipo repaint() o peggio ancora repaint temporizzati!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    innanzitutto ti ringrazio della tua risposta.

    desktop è il componente JDesktopPane della mia classe....cmq come mi ha detto te ho messo this e x adesso va.

    Ho inserito la PaintComponents cn questo codice:

    codice:
    	public void paintComponents( Graphics g ){
    		if(backImage == null)
    			super.paintComponents(g);
    		else{
    			 Graphics2D g2d = (Graphics2D)g;
    			
    			 //scale the image to fit the size of the Panel
    			 double mw = backImage.getWidth(null);
    			 double mh = backImage.getHeight(null);
    			
    			 double sw = getWidth() / mw;
    			 double sh = getHeight() / mh;
    			
    			 g2d.scale(sw, sh);
    			 //g2d.drawImage(backImage, 0, 0, this);
    			 g.drawImage(backImage,60,60,this);
    		}
    	}
    ma nn viene chiamata e infatti non inserisce alcuna immagine...
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  4. #4
    se non disturbo troppo,
    gentilmente potresti farmi qualche esempio?
    grazie
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da schumy2000
    desktop è il componente JDesktopPane
    paintComponent non paintComponents.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    si, è stato un errore di battitura.....
    togliendo il metodo paint e inserendo il PaintComponent non mi spunta più neanche l'immagine.

    Aiuto PLS
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da schumy2000
    togliendo il metodo paint e inserendo il PaintComponent non mi spunta più neanche l'immagine.
    Scusa ma hai esteso JDesktopPane?? Perché è questo che va fatto se vuoi fare l'override di paintComponent e quindi disegnare sullo "sfondo" del JDesktopPane.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    ah ecco perché non va...la mia classe estende JFrame alla fine faccio un add sul desktop che ho dichiarato e settato precedentemente....
    quindi dici che non riesco a "aggiustare" il problema se non disgiungo queste due entità (JFrame e JDesktopPane) ovvero chiamando il metodo add per la classe che estende il JDesktopPane....

    Grazie per i tuoi commenti/consigli....
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  9. #9
    Ciao,
    dovresti richiamare il metodo validate().
    Se il tuo problema è che nn si vede l'immagine quando si richiude il menu....devi mettere per esempio all'uscita del metodo che gestisce l'evento la seguente istruzione:

    desktop.validate();


    dove desktop è un'istanza di JDesktopPane.
    Ciao. Fammi sapere.

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da schumy2000
    la mia classe estende JFrame
    Quindi il tuo paintComponent era di questo JFrame. Non va bene. La struttura di un JFrame è più complessa, c'è un root pane (JRootPane) che contiene anche il ben noto content pane (dove si aggiungono i componenti). Ma il paintComponent di JFrame disegna comunque "sotto" il JRootPane/content pane, quindi appunto non vedi nulla.

    Originariamente inviato da schumy2000
    quindi dici che non riesco a "aggiustare" il problema se non disgiungo queste due entità (JFrame e JDesktopPane)
    Estendi JDesktopPane ... quale sarebbe il problema?

    Originariamente inviato da ChrisFe
    dovresti richiamare il metodo validate().
    Mi spiace ma non servirebbe a nulla. Non è una questione di "layout" manager ma di "painting".
    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 © 2026 vBulletin Solutions, Inc. All rights reserved.