Newsgroup: it.comp.java
Titolo: Solito problema

Mi sto ancora spaccando la testa con il problema che avevo già postato
che purtroppo non aveva ottenuto risposte.
Per cercare di capire cosa non va ho riscritto da capo la classe
quizzer, più piccola senza tutti i dettagli e porca miseria ancora mi
blocca la finestra.
Per chi non avesse letto l'altro post mi succede che due classi quasi
identiche differiscono del fatto che una mentre sta eseguendo un ciclo
while che aggiorna un jprogressbar non permette che si esegua alcuna
funzione sulla finestra mentre l'altra lo permette.
Vi posto i due codici nel messaggio successivo, temo che la lunghezza
del messaggio precedente abbia limitato i lettori!:D
AIUTOOOOO!:D

// Questa classe funziona correttamente, cioč mi permette di fare
altre funzioni mentre č nel while.
public class Ultima extends JFrame {
  JProgressBar jProgressBar1 = new JProgressBar();
  XYLayout xYLayout1 = new XYLayout();
  JButton jButton1 = new JButton();
  JLabel jLabel1 = new JLabel();
  int volte =0;
  long tempo =0;
  public Ultima() {
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }
  private void jbInit() throws Exception {
    this.setLocale(java.util.Locale.getDefault());
    this.getContentPane().setLayout(xYLayout1);
    jButton1.setText("jButton1");
    jButton1.addActionListener(new
Ultima_jButton1_actionAdapter(this));
    jLabel1.setText("jLabel1");
    this.getContentPane().add(jProgressBar1, new XYConstraints(41, 61,
317, -1));
    this.getContentPane().add(jButton1,   new XYConstraints(147, 190,
120, 45));
    this.getContentPane().add(jLabel1,  new XYConstraints(137, 111,
129, 24));
    jProgressBar1.setMinimum(0);
    jProgressBar1.setMaximum(10000);
    this.pack();
    this.setVisible(true);
    this.azione();
  }
  public void azione() {
    long inizio =0;
    inizio = System.currentTimeMillis();
    long temporaneo =0;
    temporaneo = System.currentTimeMillis();
    while(10000-tempo > 0) {
      tempo = temporaneo-inizio;
      temporaneo = System.currentTimeMillis();
      System.out.println("Entro"+tempo);
jProgressBar1.setValue(10000-Integer.parseInt(Long.toString(tempo)));
      try {
        Thread.sleep(100);
      }
      catch(InterruptedException ex) {
        ex.printStackTrace();
      }
    }
  }
  void jButton1_actionPerformed(ActionEvent e) {
    volte++;
    jLabel1.setText("Pulsante premuto "+volte+" volte");
  }
}
class Ultima_jButton1_actionAdapter implements
java.awt.event.ActionListener {
  Ultima adaptee;
  Ultima_jButton1_actionAdapter(Ultima adaptee) {
    this.adaptee = adaptee;
  }
  public void actionPerformed(ActionEvent e) {
    adaptee.jButton1_actionPerformed(e);
  }
  public static void main(String[] args) {
    Ultima prova = new Ultima();
    //prova.azione();
  }
}
// Questa č la classe che si blocca.
public class Quizzer extends JFrame {
  JLabel jLabel1 = new JLabel();
  JProgressBar jProgressBar1 = new
JProgressBar(JProgressBar.VERTICAL);
  JButton jButton1 = new JButton();
  JButton jButton2 = new JButton();
  JButton jButton3 = new JButton();
  JButton jButton4 = new JButton();
  final int TEMPO_MAX = 10000;
  JFrame Parent;
  ArrayList Domande = new ArrayList();
  Domanda DomandaCorrente = new Domanda();
  GridBagLayout gridBagLayout1 = new GridBagLayout();
  public Quizzer() {
    try {
      jbInit();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
  public Quizzer(JFrame parent, ArrayList domandez) {
      Parent = parent;
      Domande = domandez;
      try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }
  private void jbInit() throws Exception {
    jLabel1.setText("jLabel1");
    this.getContentPane().setLayout(gridBagLayout1);
    jButton1.setText("jButton1");
    jButton1.addActionListener(new
Quizzer_jButton1_actionAdapter(this));
    jButton2.setText("jButton1");
    jButton2.addActionListener(new
Quizzer_jButton2_actionAdapter(this));
    jButton3.setText("jButton1");
    jButton3.addActionListener(new
Quizzer_jButton3_actionAdapter(this));
    jButton4.setText("jButton1");
    jButton4.addActionListener(new
Quizzer_jButton4_actionAdapter(this));
    this.getContentPane().add(jProgressBar1,  new
GridBagConstraints(0, 0, 1, 3, 0.0, 0.0
            ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new
Insets(21, 22, 20, 0), 13, 245));
    this.getContentPane().add(jButton1,  new GridBagConstraints(1, 1,
1, 1, 0.0, 0.0
            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new
Insets(137, 55, 0, 0), 95, 18));
    this.getContentPane().add(jLabel1,  new GridBagConstraints(1, 0,
2, 1, 0.0, 0.0
            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new
Insets(21, 30, 0, 26), 380, 93));
    this.getContentPane().add(jButton2,  new GridBagConstraints(2, 1,
1, 1, 0.0, 0.0
            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new
Insets(136, 26, 0, 53), 95, 18));
    this.getContentPane().add(jButton3,  new GridBagConstraints(1, 2,
1, 1, 0.0, 0.0
            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new
Insets(14, 55, 70, 0), 95, 18));
    this.getContentPane().add(jButton4,  new GridBagConstraints(2, 2,
1, 1, 0.0, 0.0
            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new
Insets(14, 26, 70, 53), 95, 18));
    jProgressBar1.setMinimum(0);
    jProgressBar1.setMaximum(TEMPO_MAX);
    jProgressBar1.setValue(5000);
    this.pack();
    this.setVisible(true);
    int temp = JOptionPane.showConfirmDialog(this,"Vuoi
continuare?","",
JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);
    if(temp == JOptionPane.NO_OPTION) {
      Parent.setVisible(true);
      this.setVisible(false);
      return;
    }
    else {
      //this.pack();
      //this.setVisible(true);
      this.azione();
    }
  }
  public void azione() {
    /*for(int k =0; k<Domande.size(); k++) {
      DomandaCorrente = (Domanda)Domande.get(k);
      this.faiDomanda(DomandaCorrente);
    }*/
    long inizio;
    long tempo = 0;
    inizio = System.currentTimeMillis();
    while(10000-tempo >= 0) {
      tempo = System.currentTimeMillis() - inizio;
      int valore = Integer.parseInt(Long.toString(tempo));
      try{
        Thread.sleep(100);
      }
      catch(InterruptedException ex) {
        ex.printStackTrace();
      }
      System.out.println(valore);
    }
  }
  public void faiDomanda(Domanda domanda) {
    this.setLocale(java.util.Locale.getDefault());
    jButton1.setVisible(true);
    jButton2.setVisible(true);
    jButton3.setVisible(true);
    jButton4.setVisible(true);
    jLabel1.setVisible(true);
    jLabel1.setText(DomandaCorrente.getDomanda());
    jButton1.setText(DomandaCorrente.getRisp1());
    jButton2.setText(DomandaCorrente.getRisp2());
    jButton3.setText(DomandaCorrente.getRisp3());
    jButton4.setText(DomandaCorrente.getRisp4());
    long inizio;
    long tempo = 0;
    inizio = System.currentTimeMillis();
    while(tempo >= 0) {
      tempo = TEMPO_MAX -(System.currentTimeMillis()-inizio);
      int valore = Integer.parseInt(Long.toString(tempo));
      System.out.println(valore);
      jProgressBar1.setValue(valore);
      try {
        Thread.sleep(100);
      }
      catch(InterruptedException ex) {
        ex.printStackTrace();
      }
    }
  }
  void jButton1_actionPerformed(ActionEvent e) {
  }
}
class Quizzer_jButton1_actionAdapter implements
java.awt.event.ActionListener {
  Quizzer adaptee;
  Quizzer_jButton1_actionAdapter(Quizzer adaptee) {
    this.adaptee = adaptee;
  }
  public void actionPerformed(ActionEvent e) {
    adaptee.jButton1_actionPerformed(e);
  }
}
class Quizzer_jButton2_actionAdapter implements
java.awt.event.ActionListener {
  Quizzer adaptee;
  Quizzer_jButton2_actionAdapter(Quizzer adaptee) {
    this.adaptee = adaptee;
  }
  public void actionPerformed(ActionEvent e) {
    adaptee.jButton1_actionPerformed(e);
  }
}
class Quizzer_jButton3_actionAdapter implements
java.awt.event.ActionListener {
  Quizzer adaptee;
  Quizzer_jButton3_actionAdapter(Quizzer adaptee) {
    this.adaptee = adaptee;
  }
  public void actionPerformed(ActionEvent e) {
    adaptee.jButton1_actionPerformed(e);
  }
}
class Quizzer_jButton4_actionAdapter implements
java.awt.event.ActionListener {
  Quizzer adaptee;
  Quizzer_jButton4_actionAdapter(Quizzer adaptee) {
    this.adaptee = adaptee;
  }
  public void actionPerformed(ActionEvent e) {
    adaptee.jButton1_actionPerformed(e);
  }
}


Non ho analizzato approfonditamente il codice ma credo che il problema sia
dovuto al fatto che Swing aggiorna il componenti grafici SOLO DOPO aver
gestito la coda di eventi.
Detto in altre parole, se te hai un pulsante alla cui pressione visualizzi
una finestra (che nel proprio codice contiene l'aggiornamento di una
progress bar) non vedrai i componenti aggiornati fino alla conclusione del
metodo richiamato dalla pressione del pulsante.
Nella classe che 'funziona' tu visualizzi la finestra (e la progress bar)
richiamando da main e quindi FUORI dalla gestione degli eventi Swing (tale
coda rimane libera per gestire la pressione dei pulsanti).
Nella classe che non funziona invece la visualizzazione della finestra è
scatenata da un evento SWING.
Per aggiornare il progress bar devi creare un thread che farai partire alla
pressione del bottone: l'esecuzione del thread è parallela quindi l'evento
Swing conclude quasi subito mentre il thread gira e ti aggiorna la progress
bar.
Non so se ti sono stato di aiuto ma i concetti esposti (in modo semplice)
sono cmq validi.
E' per questo motivo che in Java è difficile, per esempio, far apparire una
finestra prima di eseguire un codice pesante e poi farla sparire. In pseudo
codice:
bottone1_actionPerformed() {
finestraDiAttesa.show()
.
Codice LUNGO
.
finestraDiAttesa.hide()
}
Swing non aggiorna la grafica fino a che non ha eseguito tutto
bottone1_actionPerformed()  e quindi finestraDiAttesa non verrà visualizzata
oppure visualizzata parzialmente.
Saluti
Francesco

Grazie mille dell'aiuto, purtroppo però non sono ancora riuscito a
sistemare questo problema:
Ho creato un Thread (ThreadProva) a cui passo la barra, lo faccio
partire e fino a che non finisce il while (praticamente per dieci
secondi) non mi permette l'utilizzo della finestra, proprio come
prima.
Per Francesco: Per prima cosa molte grazie per la risposta!:D e poi mi
potresti consigliare un sito/testo che spieghi dettagliatamente quello
che mi hai detto?

 che mi hai detto?
Un po' di spiegazioni precise sono indispensabili :-))))
Allora, se ricerchi nella documentazione i metodi SwingUtilities.InvokeLater
e SwingUtilities.InvokeAndWait (non so se i nomi sono proprio esatti)
dovresti trovare qualcosa; prova a vedere anche il Tutorial.
Inoltre ricerca su internet il package FoxTrot (mi pare): serve per fare
qualcosa di simile!!!


wrote:

Grazie mille Francesco, ora vado subito alla ricerca!:D
Se non era per te non avrei saputo nemmeno da dove incominciare a
cercare!:D
Ciao ciao!

SONO RIUSCITO A RISOLVERE IL PROBLEMA!
GRANDI EMOZIONI!:D
heeheh
Scusate lo sfogo...
Grazie mille Francesco per il tuo aiuto, mi sarei fracassato il cranio
contro lo schermo dal nervoso se non fosse stato per te!:D
Ho utilizzato la classe SwingWorker e ho risolto! MBITICO!
eheheh
Allora, mi sono informato riguardo quello che mi hai detto e sono
giunto a questa conclusione (Io ti dico ciò che ho capito e tu mi dici
se è corretto):
Tutti gli eventi swing vengono gestiti in un unico thread chiamato
EventDispatchThread.
Quindi tutto il mio programma, che era strutturato da varie finestre
girava nello stesso thread poichè tutte le finestre erano state create
da eventi.
Di conseguenza quando una funzione (scaturita da un evento) è molto
lunga occupa per molto tempo l' EventDispatchThread che intanto però
mette in coda tutti gli altri eventi.
Così, per le funzioni lunghe conviene delegare il lavoro a SwingWorker
che apre un nuovo thread ed è indipendente da EventDispatchThread.
Giusto?!
Grazie mille ancora per l'aiuto!

 che apre un nuovo thread ed è indipendente da EventDispatchThread.
Una descrizione perfetta del problema. In bocca al lupo !