Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    75

    [JAVA SWING] Chiarimenti repaint()

    Buongiorno a tutti,
    avrei un paio di dubbi sulla chiamata al metodo repaint(), so che quando chiamo la repaint() viene ridisegnato il componente su cui viene invocato, però non mi sono chiare alcune cose:

    1) Se chiamo la repaint() su un componente, viene ridisegnato solo il componente o anche ciò che lo contiene (ad esempio un pannello) ?

    2) ho fatto un esempio in cui faccio muovere dei pannelli in un pannello che li contiene e che contiene anche degli oggetti grafici. Ho inserito un timer all'interno del pannello che contiene il tutto che ogni 100 millisecondi va a fare la repaint() e se nel frattempo si è spostato qualcosa quindi la ridisegna. Ora però ho notato che al cresce degli oggetti all'interno del pannello che contiene il tutto, diventa via via tutto poco reattivo. Io invece avrei bisogno di essere sicuro che le cose si muovano esattamente ogni 100 millisecondi, come posso risolvere?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA SWING] Chiarimenti repaint()

    Originariamente inviato da gatsu85
    1) Se chiamo la repaint() su un componente, viene ridisegnato solo il componente o anche ciò che lo contiene (ad esempio un pannello) ?
    Viene ridisegnato tutto ciò che interseca il rettangolo di "clip" (determinato dalla richiesta di repaint), compresi bordi e componenti "figli" contenuti in quel componente.

    La regione di ridisegno dipende dalla richiesta di repaint. Se usi comp.repaint() (quello senza argomenti) vuol dire "tutto", se usi es. comp.repaint(10, 10, 60, 40) tutto quello che interseca questo rettangolo viene ridisegnato: quella porzione del componente, eventuali suoi bordi (se li interseca), i componenti contenuti (quelli che interseca) compresi i loro bordi e ulteriori componenti figli.
    (per bordi intendo il Border che un componente Swing può gestire)

    Originariamente inviato da gatsu85
    2) ho fatto un esempio in cui faccio muovere dei pannelli in un pannello che li contiene e che contiene anche degli oggetti grafici. Ho inserito un timer all'interno del pannello che contiene il tutto che ogni 100 millisecondi va a fare la repaint() e se nel frattempo si è spostato qualcosa quindi la ridisegna. Ora però ho notato che al cresce degli oggetti all'interno del pannello che contiene il tutto, diventa via via tutto poco reattivo. Io invece avrei bisogno di essere sicuro che le cose si muovano esattamente ogni 100 millisecondi, come posso risolvere?
    Non so se l'avevo detto a te o ad un altro sul forum: se hai un contenitore senza layout manager (= posizionamento assoluto) che contiene N componenti, per spostarli basta solo setLocation (o al limite setBounds).
    Non serve un repaint esplicito solo per spostarli.
    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
    Feb 2009
    Messaggi
    75

    Re: Re: [JAVA SWING] Chiarimenti repaint()

    Originariamente inviato da andbin
    Viene ridisegnato tutto ciò che interseca il rettangolo di "clip" (determinato dalla richiesta di repaint), compresi bordi e componenti "figli" contenuti in quel componente.

    La regione di ridisegno dipende dalla richiesta di repaint. Se usi comp.repaint() (quello senza argomenti) vuol dire "tutto", se usi es. comp.repaint(10, 10, 60, 40) tutto quello che interseca questo rettangolo viene ridisegnato: quella porzione del componente, eventuali suoi bordi (se li interseca), i componenti contenuti (quelli che interseca) compresi i loro bordi e ulteriori componenti figli.
    (per bordi intendo il Border che un componente Swing può gestire)

    Non so se l'avevo detto a te o ad un altro sul forum: se hai un contenitore senza layout manager (= posizionamento assoluto) che contiene N componenti, per spostarli basta solo setLocation (o al limite setBounds).
    Non serve un repaint esplicito solo per spostarli.
    Ti ringrazio, come al solito sei molto chiaro e preciso nelle risposte. Per quanto riguarda la risposta 2) sapevo che bastava fare setBounds(), però qusto vale solo per i componenti, per oggetti grafici disegnati nella paint component devo per forza chiamare la repaint(), e quini essendo oggetti grafici e componenti nello stesso pannello devo chiamare per forza la repaint() del pannello, però ora proverò a chiamare la repaint solo per la zona in cui ci sono gli oggetti grafici. Non so se sia quello il problema però, cioè se chiamo setBounds e poi anche la repaint(), praticamente faccio la repaint() due volte?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: Re: [JAVA SWING] Chiarimenti repaint()

    Originariamente inviato da gatsu85
    per oggetti grafici disegnati nella paint component devo per forza chiamare la repaint(), e quini essendo oggetti grafici
    Se hai un componente che disegna delle "figure" che si spostano (da sole in modo temporizzato o a seguito di altri eventi), allora certo che un repaint esplicito serve. Ma sarebbe meglio incapsulare questa cosa, cioè fare in modo che sia il componente stesso, al suo interno, a chiedere il repaint. Non dall'esterno.

    Pensa solo un attimo: quando fai es. un label.setText(...) mica devi fare dall'esterno un repaint! È la label che determina e "sa" se/dove/come ridisegnarsi e all'interno da qualche parte farà di certo un repaint ma è appunto interno.

    Originariamente inviato da gatsu85
    e componenti nello stesso pannello
    Se in un componente ci disegni dentro E allo stesso tempo fa anche da "contenitore" per N componenti, effettivamente è un pochino più critico (ma nulla di sbagliato o impossibile comunque).

    Originariamente inviato da gatsu85
    devo chiamare per forza la repaint() del pannello, però ora proverò a chiamare la repaint solo per la zona in cui ci sono gli oggetti grafici. Non so se sia quello il problema però, cioè se chiamo setBounds e poi anche la repaint(), praticamente faccio la repaint() due volte?
    Dovrei andare a rileggere un ottimo documento (prova a leggerlo anche tu se non lo conosci) che è:
    Painting in AWT and Swing

    Comunque per le figure che disegni e intendi spostare, prova a richiedere per ognuna il repaint dell'area vecchia+nuova.
    repaint è una richiesta "asincrona" e più richieste di repaint con rettangoli diversi vengono di norma "fuse" insieme.
    Se una figura era al rettangolo x=10,y=10,w=40,h=30 e tu ti sei segnato (in una tua struttura dati) che dovrà essere ridisegnata a x=20,y=20, allora puoi richiedere:
    repaint(10,10,40,30)
    e
    repaint(20,20,40,30)
    in sequenza e queste due saranno "fuse" poi in un repaint unico di x=10,y=10,w=50,h=40 e quindi verrà "pulita" la sezione vecchia e tu disegnerai la figura nel nuovo posto.
    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.