Newsgroup: it.comp.java
Titolo: incompatibilita' di carattere con ProgressMonitor

Ho un problemino con questo simpatico oggetto ( e con il suo simile
ProgressBar) ... in un programma abbastanza complesso non riesco a far
vedere la barra di scorrimento, per semplicita' pero' vi mostrero' il
problema su un esempio ben piu' facile :
PROVA 1 :
    final int Max = 4;
    final ProgressMonitor wPM = new ProgressMonitor(null,
"Aggiornamento in corso", "", 0, Max);
    wPM.setProgress(0);
    wPM.setMillisToDecideToPopup(10);
    // richiesta senza attesa di risposta
    for ( int i = 0; i<Max; i++) {
      wPM.setProgress(i);
      try {
        Thread.sleep(1000);
      }
      catch (InterruptedException ex) {
      }
    }
    JOptionPane.showMessageDialog(null, "fine");
la barra ovviamente, si fa' per dire, non si vede.
PROVA 2 :
    final int Max = 4;
    final ProgressMonitor wPM = new ProgressMonitor(null,
"Aggiornamento in corso", "", 0, Max);
    wPM.setProgress(0);
    wPM.setMillisToDecideToPopup(10);
    // richiesta senza attesa di risposta
    final Runnable t = new Runnable() {
      public void run() {
        for ( int i = 0; i<Max; i++) {
          wPM.setProgress(i);
          try {
            Thread.sleep(1000);
          }
          catch (InterruptedException ex) {
          }
        }
      }
    };
    Thread myt = new Thread(t);
    myt.start();
    JOptionPane.showMessageDialog(null, "fine");
la barra si vede ma il messaggio me lo da' troppo presto!
PROVA 3 :
    .
    .
    .
    Thread myt = new Thread(t);
    myt.start();
    try {
      myt.join();
    }
    catch (InterruptedException ex) {
    }
    JOptionPane.showMessageDialog(null, "fine");
si blocca n'altra volta!
Ho provato come dice il tutorial java anche con lo SwingWorker ma ho
sempre avuto il problema della PROVA 2, il timer non ho provato
perche' non riesco a capire come fare?!

 PROVA 2 :
     //Metti questa dichiarazione nella classe, non nel metodo in esame
     //, così quando termina il metodo non viene distrutto il thread
     //, dato che la ho eliminato la join
     private Thread myt = null;
     final int Max = 4;
     final ProgressMonitor wPM = new ProgressMonitor(null, "Aggiornamento in
corso", "", 0, Max);
     wPM.setProgress(0);
     wPM.setMillisToDecideToPopup(10);
     // richiesta senza attesa di risposta
     final Runnable t = new Runnable()
    {
       public void run()
      {
         for ( int i = 0; i<Max; i++)
        {
           wPM.setProgress(i);
           try
          {
             Thread.sleep(1000);
          }
          catch (InterruptedException ex)
          {
          }
        }//fine ciclo for
         JOptionPane.showMessageDialog(null, "fine");
      }
    };
     myt = new Thread(t);
     myt.start();
Bye

...

Inanzi tutto grazie del tuo tempo.
Cosi' funziona, ma come ho specificato nel preambolo il mio vero
problema sta' in un codice piu' complesso. Il :
JOptionPane.showMessageDialog(null, "fine");
lo devo fare quando ha finito il thread ma non lo posso spostre da
sotto lo
      myt = new Thread(t);
      myt.start();
      JOptionPane.showMessageDialog(null, "fine");
perche' in realta' il mio ciclo for fai conto che scarichi un file da
internet
da una classe A che viene chiamata da una B e alla fine devo tornare
alla classe B che dopo aver scaricato il file lo rielabora.

 
Ciao,
humz, forse non ho capito bene ma da me gli esempi 1 e 3 funzionano(si 
vede la sbarra aumentare e poi fine).
Marco
-- 
replay: remove .duh.spam

 wrote in message
news:9e2e9994.03100...@posting.google.com...


Purtroppo mi e' impossibile mettere il codice, dato che sono una serie
di classi che si chiamano. il problema e' che tu metti sempre il
messaggio di fine dentro il thread nuovo, ovvero quello che fa' il
ciclo con la progress bar
final Runnable t = new Runnable()
     {
        public void run()
       {
          File fileReadFromInternet = new
File("C:\\internetDownloaded.txt");
          final long TOTAL_SIZE = 100000;//Suppongo che la lunghezza
sia
definita a priori
          //altrimenti si possono usare altri sistemi...
                    int i = 0;
         do
         {
             i = (int)(TOTAL_SIZE / fileReadFromInternet .size() *
100);
            wPM.setProgress(i);
            try
           {
              Thread.sleep(1000);
           }
           catch (InterruptedException ex)
           {
           }
         }while(fileReadFromInternet .size() < TOTAL_SIZE);
          // non posso meterlo qui!!!
          JOptionPane.showMessageDialog(null, "fine");
       }
     };
ma devo metterlo fuori dal nuov thread perche' in realta' tale thread
deve bloccare il proseguire del mio programma mentre invece ovviamente
prosegue dopo
il  :
Thread aa = new Thread(t);
aa.start(); // vorrei che mi si bloccasse qui !
JOptionPane.showMessageDialog(null, "fine");
pero' dal codice che ti ho postato la prima volte se metto :
    try {
      aa.join();
    } catch (InterruptedException ex) {
    }
il Thread mi si blocca fino a che non ha finito il ciclo ma a quel
punto credo che bloccandosi li' l'esecuzione il pacchetto swing non
riesca a refresciare gli oggetti di conseguenza il mio ProgressMonitor
PS. ho visto il messaggio di "cthulhu" e mi ha un po' fatto
riflettere, non sara' un problema di VM la versione che ho e' : "java
1.4.1_02-b06"

...

BEATO TE !
a me no e mi ci sto' dannando da ben tre giorni su sta' cazzata !
la versione della mia VM e' : "java 1.4.1_02-b06" potrebbe entrarci nulla?
nel frattempo provero' ad aggiornarmi.

 nel frattempo provero' ad aggiornarmi.
Potrebbe..
Io sto usando la 1.4.2_01-b06


...

Sono sconsolato ho aggiornato la VM a "java version 1.4.2-b28" e nulla
da fare per risolvere ho fatto una classe mia JDialog che fa :
  public void setProgress(final int wProgressione) {
    frm.paintImmediately( frm.getBounds() );
  }
cosi' funziona, ma quando si preme il pulsante non lo sente e
sopratutto e' una grossa SCONFITTA PERSONALE !!! sig, sig

 sopratutto e' una grossa SCONFITTA PERSONALE !!! sig, sig
Che OS usi?


...

Windows 98


Hum humz, forse è quello.. io sto usando XP.
-- 
replay: remove .duh.spam

...

Grazie provero' ma dato che non posso farlo nell'immediato, caso mai
postero' piu' avanti il mio problema!