Newsgroup: it.comp.java
Titolo: Si può aspettare che paint finisca di disegnare un Component?

Quanto segue trasforma in immagine il contenuto di un Component. L'unico neo 
è che la visualizzazione dello stesso (almeno in Windows non indispensabile, 
a dire il vero, per il corretto funzionamento del programma) avviene in 
ritardo, e viene completamente bloccata dall'istruzione "System.in.read();" 
che aspetta la pressione di un tasto per terminare il programma 
("System.exit(0);").
I Frame aperti rimangono così irrimediabilmente bianchi, a meno di togliere 
le due istruzioni "System.in.read();" e "System.exit(0);", peraltro esterne 
alla classe. Non così grave, visto che l'immagine viene comunque ritornata 
correttamente in uscita dal metodo, anche se non visualizzata dal Frame, se 
non fosse per il fatto che, sotto Linux (Fedora 3), mi compare un'eccezione 
che blocca tutto, e oltre a non poter visualizzare l'immagine, non riesco 
neanche a salvarla, come invece accade regolarmente con Windows XP o 2000. 
Alla faccia della portabilità, che vorrebbe che le applicazioni java siano 
compatibili con tutti i sistemi operativi.
Qualcuno sa aiutarmi?
public static java.awt.Image getImage(Component c)
   {
    java.awt.Dimension d = c.getSize(); //dimensioni del Component
    d.setSize(c.dimx,c.dimy);
    java.awt.Frame f = new java.awt.Frame(); //nuovo Frame
    f.addNotify(); // questo chiama il "peer", cioè il metodo proprio del 
sistema operativo per creare l'immagine, se non ho capito male
    f.setSize(d.width+10,d.height+40); //setta dimensioni del Frame
    Toolkit tk = Toolkit.getDefaultToolkit();
    int Larghezza = tk.getScreenSize().width; //calcolo posizione del Frame
    if (xFrame+d.width+10>Larghezza) //per visualizzarne più di uno in 
successione
     {
      xFrame=0;
      yFrame=nextyFrame;
     }
    f.setLocation(xFrame,yFrame);//setta locazione del Frame
    xFrame=xFrame+d.width+10;
    if (yFrame+d.height+40>nextyFrame) {nextyFrame=yFrame+d.height+40;}
    f.add(c); //aggiunge Component al Frame
    f.show(); //mostra Frame
    final Frame frame=f;//serve per windowClosing, che vuole variabili final
    f.addWindowListener //fa sì che premendo sul tasto "x" la finestra si 
chiuda
     (
      new java.awt.event.WindowAdapter()
       {
        public void windowClosing(java.awt.event.WindowEvent e)
         {
          frame.setVisible(false);
         }
       }
     );
    java.awt.Image i = f.createImage(d.width, d.height);//crea un'immagine 
dal Component
    c.paint(i.getGraphics());//richiama metodo grafico
    return i; // ritorna immagine come valore della funzione
   }

 dire il vero, per il corretto funzionamento del programma)
... Volevo dire che la visualizzazione a me non serve (devo solo salvare 
l'immagine), ma ho il dubbio che l'eccezione sollevata da Linux dipenda dal 
fatto che l'immagine non è ancora stata visualizzata, e quindi in un certo 
senso non esiste. 


cioe' tu usi chiamate da console, con applicazioni grafiche?
-- 
{2Nd+BESt}

> cioe' tu usi chiamate da console, con applicazioni grafiche?
Al momento sě. Me lo chiedi perchč c'č qualcosa di scorretto in questo modo 
di procedere, secondo te?? Finchč non si completa il lavoro č molto comodo 
testare cosě quanto fatto finora. 


beh diciamo ti conviene restare in "modalita' grafica", nel senso che se 
devi chiedere dell'input all'utente ti eviti un bel po di fatica usando 
componenti grafici come JTextArea JTextField...
se devi attendere la pressione di un tasto, invece di un "tasto della 
tastiera" usa un Jbutton..
l'unico caso e' che diventa "comodo", poco dispendioso usare la console 
x il debug...
-- 
{2Nd+BESt}

 il debug...
È più o meno quello che sto facendo (se non ci fosse System.out.print nella 
fase di debug, penso che sarei ancora in alto mare).


boh... nn ho capito niente.
cioe' il tuo problema e' che se nn metti il 
system.in
 ti si chiude tutto 
nn appena finita l'operazione sulle immagini, e quindi nn riesci a 
vedere niente.
invece se lo metti, resti bloccato fino a premere il tasto da tastiera.. ?
e se invece crei un frame e su questo ci piazzi un Component, tipo 
panel, nel quale andrai a disegnare  l'immagine? Cosi' nn ti si chiude 
da solo...
-- 
{2Nd+BESt}

> boh... nn ho capito niente.
Dunque: io aggiungo un Component (con il suo bravo contenuto grafico) ad un 
Frame, ma la visualizzazione a schermo richiede qualche secondo. Nel 
frattempo il programma va avanti per conto suo, mentre io devo "fermarlo" 
finchè il Frame non diventa completamente visibile (contenuto grafico 
compreso, ovviamente). Il resto sono dettagli poco importanti. Mi serve 
qualcosa tipo il seguente:
      MediaTracker track = new MediaTracker(this);
      track.addImage(immagine,0);
      track.waitForID(0);//aspetta che l'immagine sia caricata per 
proseguire
Solo, io devo aspettare la visualizzazione del Frame, e non il caricamento 
dell'immagine come fa MediaTracker. Il tutto, usando awt, e non swing.


dovrei vedere il codice, ti sto facendo perdere tempo
-- 
{2Nd+BESt}


perche' tipo mettere le due cose su 2 thread e sincronizzarli fra 
loro... con wait/notify
-- 
{2Nd+BESt}

Come non detto. Ho scoperto che Fedora 3 usa, per default, /usr/bin/java, 
anzichè /usr/bin/jre1.5.0_01/bin/java.
Insomma, un java "autoctono", che sollevava eccezioni ad ogni piè sospinto, 
mettendo a dura prova la mia fiducia nella portabilità di java.
Invece, con il comando java di Sun, funziona tutto come dovrebbe. A questo 
punto, chi se ne frega se non si vedono i Frame (anzi, in effetti mi serve 
solo richiamarne il metodo grafico per ricavare un'immagine, e non 
visualizzarli).
Grazie di tutto.