Newsgroup: it.comp.java
Titolo: refresh immagine java swing

Salve a tutti,
ho un'applicazione  che consiste in due classi, una contenente il
JFrame e una contenente un JPanel che ha sua volta contiene il metodo
paint. Il Frame che è la finestra principale contiene all'intreno il
pannello dell'altra classe e un bottone, nel momento in cui schiaccio
il pulsante, ogni 2-3 secondi dovrei fare in modo che il JPanel
disegni un'oggetto in una posizione diversa.
Ho provato a fare un ciclo all'interno dell'azione del pulsante,
specificando ad ogni ciclo un oggetto.updateUI , ma così non funziona,
non aggiorna nulla.
Vi prego suggeritemi qualche soluzione.
Grazie a tutti

fox82 ha scritto:

Quando premi il pulsante, crei un thread che invoca print() sul JPanel e 
poi si mette in sleep per tot millisecondi ciclicamente.
se ho tempo dopo ti posto i dettagli.


Ci sarebbero molte cose da dire sull'argomento, per cui mi limiterò a
darti qualche dritta in generale, aspettando un tua richiesta più
specifica:
- se stai usando un JPanel e non vuoi utilizzare alcun LayoutManager
di quelli esistenti e se questo "oggetto" che vuoi disegnare sul
JPanel è a sua volta un Component, un modo per ottenere quello che
cerchi è quello di ridefinire il metodo 'doLayout' del JPanel.
All'interno di questo metodo ti basterà richiamare il metodo
'setBounds' sull'oggetto che vuoi "spostare", usando come coordinate
delle variabili di classe che potrai cambierai come meglio credi
all'occorrenza (in seguito alla pressione del pulsante potresti
effettivamente far partire un thread come ti hanno già suggerito).
Se prendi questa strada dovrai fare in modo che venga richiamato il
metodo 'validate' o meglio ancora 'revalidate' sul JPanel ogni volta
che cambierai le coordinate dell'oggetto.
- se questo "oggetto" è invece una figura geometrica o qualcosa che
stai cercando di "disegnare" sul JPanel, non ridefinire il metodo
'paint' che hai menzionato ma semmai il metodo 'paintComponent' (dai
un'occhiata alle API per capire la differenza...)
- se ridefinisci 'paintComponent(..)' ricordati di richiamare sempre
super.paintComponent(..)! anche per questo, ti consiglio di vedere
sulle API..
- se vuoi forzare un componente a "ridisegnarsi" devi semplicemente
richiamare il metodo 'repaint()' (e non il metodo 'paint'). Ricorda
comunque che questo metodo viene automaticamente richiamato se usi
metodi quali 'add', 'remove', 'setBounds', 'setSize', etc... sul
componente/container.
Nel tuo caso, se stai ridefinendo il metodo 'paintComponent' come ti
ho detto, ti toccherà richiamare 'repaint()' sul JPanel subito dopo
aver cambiato le coordinate.
Prima di andare oltre aspetto una tua risposta.. non vorrei essere
andato troppo oltre!
Ciao,
Francesco
________________________
http://just-share-it.blogspot.com/

 ...
Rileggendo quello che hai scritto in questa parte mi è venuta in mente
un'altra cosa importantissima: MAI e poi MAI fare cicli indefiniti
dentro i metodi dei listener, come stai dicendo. A eseguire quelle
porzioni di codice è un thread che non deve essere per nessuna ragione
impegnato più del dovuto (anche qui il discorso sarebbe da
approfondire...) . Il modo corretto è quello di utilizzare il metodo
SwingUtilities.invokeLater(Runnable runnable) per il quale, inutile
dirlo, ti consiglio di andare a vedere la documentazione! :D
Ciao!
________________________
http://just-share-it.blogspot.com/

archimede ha scritto:

Una disattenzione che il post di Francesco (scusami il tu), 
evidentemente il metodo più adatto a forzare il ridisesco del componente 
è repaint e non print (anche se funge lo stesso).

Alla fine ho risolto utilizzando la classe Timer, che mi scatena
un'azione di updateUI, ogni tot secondi, timer che partirà ovviamente
nel momento in cui si clicca il pulsante.
Grazie a tutti


L'utilizzo della classe Timer è senz'altro la scelta migliore, sempre
ammesso che tu stia usando javax.swing.Timer e non java.util.Timer..!
Richiamare il metodo updateUI, invece, è sbagliato: quel metodo è
richiamato in seguito ad un cambio di look and feel e quindi nel tuo
caso non c'entra niente! Ripeto: dai un'occhiata ai metodi 'repaint()'
e 'revalidate()'.. a seconda del contesto, basterà richiamare uno di
questi due.
