Newsgroup: it.comp.java
Titolo: JProgressBar...

Ciao ragazzi!
Sono un newbie, ho già scritto qualche volta (solo per chiedere aiuto,
purtroppo non sono ancora in grado di rispondere) e questa volta ho un
problema che è scaturito con le JProgressBar.
Sto cercando di scrivere per allenamento un programma di quiz, ma non
capisco una cosa in particolare.
Vorrei che ci fosse una barra che segnasse il tempo a disposizione per
rispondere alla domanda.
Allora ho creato un JProgressBar a tale scopo, che dentro un while
viene aggiornata ogni 100 millisecondi.
Nella classe Quizzer.java (che vi riporterò sotto) mi compare la
finestra con le domande e i pulsanti delle risposte ma la jprogress
bar non si aggiorna e "sembra" che il while blocchi tutta la finestra
(visto che non posso premere alcun pulsante).
La cosa strana però è che questo problema non me lo da in una classe
(Ultima.java) che ho creato prima di inserire la barra di progresso in
quizzer.java, infatti sebbene la barra si aggiorni ( cosa che non
accade in quizzer.java (non so per quale motivo)) mi permette di
premere i pulsanti.
Non penso di essere stato molto chiaro ma spero che abbiate capito
qual'è il mio programma.
Vorrei inoltre che qualcuno mi spiegasse esattamente come funge la
funzione pack() e validate() e che differenza c'è!
Vi riporto qui sotto i sorgenti dei due files... spero sappiate
aiutarmi!
package quiz;
import javax.swing.*;
import java.io.*;
import java.util.*;
import com.borland.jbcl.layout.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.*;
/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2003</p>
 * <p>Company: </p>
 * @author not attributable
 * @version 1.0
 */
public class Quizzer extends JFrame {
  ArrayList Domande = new ArrayList();
  JFrame Parent = new JFrame();
  Giocatore Player = new Giocatore();
  XYLayout xYLayout1 = new XYLayout();
  JLabel jLabelDomanda = new JLabel();
  JButton jButton1 = new JButton();
  JButton jButton2 = new JButton();
  JButton jButton3 = new JButton();
  JButton jButton4 = new JButton();
  JLabel jLabel2 = new JLabel();
  JLabel jLabel3 = new JLabel();
  JLabel jLabelPunti = new JLabel();
  JLabel jLabelVite = new JLabel();
  final int TEMPO_MAX = 10000;
  boolean b = false;
  Domanda tempz = new Domanda();
  int tempo;
  TitledBorder titledBorder1;
  Flag flag = new Flag(false);
  JProgressBar jProgressBar1 = new
JProgressBar(JProgressBar.VERTICAL,0, TEMPO_MAX);
  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 {
    titledBorder1 = new TitledBorder("");
    jLabelDomanda.setFont(new java.awt.Font("SansSerif", 1, 16));
    jLabelDomanda.setHorizontalAlignment(SwingConstants.CENTER);
    jLabelDomanda.setText("Testo della domanda");
    this.getContentPane().setLayout(xYLayout1);
    jButton1.setText("Risposta 1");
    Quizzer_jButton1_actionAdapter ricevitore = new
Quizzer_jButton1_actionAdapter(this);
    jButton1.addActionListener(ricevitore);
    jButton2.addActionListener(ricevitore);
    jButton3.addActionListener(ricevitore);
    jButton4.addActionListener(ricevitore);
    jButton2.setText("Risposta2");
    jButton3.setToolTipText("");
    jButton3.setText("Risposta 3");
    jButton4.setText("Risposta 4");
    xYLayout1.setWidth(521);
    xYLayout1.setHeight(436);
    jLabel2.setText("Punti:");
    jLabel3.setText("Vite");
    jLabelPunti.setText("jLabel4");
    jLabelVite.setText("jLabel5");
    this.setFont(new java.awt.Font("Dialog", 0, 12));
    this.getContentPane().add(jButton1, new XYConstraints(118, 274,
166, 45));
    this.getContentPane().add(jButton2, new XYConstraints(311, 273,
166, 45));
    this.getContentPane().add(jButton3, new XYConstraints(119, 326,
166, 45));
    this.getContentPane().add(jButton4, new XYConstraints(311, 326,
166, 45));
    this.getContentPane().add(jLabelDomanda, new XYConstraints(89, 14,
402, 71));
    this.getContentPane().add(jLabel2,   new XYConstraints(35, 391,
31, 25));
    this.getContentPane().add(jLabel3,    new XYConstraints(150, 394,
55, 20));
    this.getContentPane().add(jLabelPunti,  new XYConstraints(67, 394,
47, 21));
    this.getContentPane().add(jLabelVite,  new XYConstraints(179, 395,
58, 22));
    this.getContentPane().add(jProgressBar1,   new XYConstraints(28,
23, 31, 353));
    //this.pack();
    //this.setVisible(true);
    //Parent.setVisible(false);
    /*
     Ora setto il giocatore qui anche se successivamente bisogna
scrivere un costruttore
     adatto, che prenda un giocatore come parametro.
    */
   Player.setNome("Giocatore 1");
   Player.setVite(3);
   Player.setPunteggio(0);
   this.pack();
   this.setVisible(true);
    int scelta = JOptionPane.showConfirmDialog(this,"Sei pronto per
incominciare a quizzare?", "Quizzodromo", JOptionPane.YES_NO_OPTION,
JOptionPane.PLAIN_MESSAGE);
    if(scelta == JOptionPane.NO_OPTION) {
      Parent.setVisible(true);
      this.setVisible(false);
      return;
    }
    else {
      this.setVisible(true);
      Parent.setVisible(false);
      this.azione();
    }
  }
  //In azione devo imporre la clausola che le vite devono essere
positive.
  public void azione() {
    for(int k = 0; k<Domande.size();k++) {
      tempz = (Domanda)Domande.get(k);
      faiDomanda(tempz);
    }
  }
  public void faiDomanda(Domanda domanda) {
    long inizio = 0;
    long temporaneo =0;
    jLabelDomanda.setText(domanda.getDomanda());
    jButton1.setText(domanda.getRisp1());
    jButton2.setText(domanda.getRisp2());
    jButton3.setText(domanda.getRisp3());
    jButton4.setText(domanda.getRisp4());
    jButton1.setVisible(true);
    jButton2.setVisible(true);
    jButton3.setVisible(true);
    jButton4.setVisible(true);
    inizio = System.currentTimeMillis();
    //Devo fare questo pezzo con il while in thread altrimenti mi
blocca tutta la finestra.
    while(TEMPO_MAX-(temporaneo-inizio) > 0) {
      temporaneo = System.currentTimeMillis();
      tempo = TEMPO_MAX -
Integer.parseInt(Long.toString(temporaneo-inizio));
      System.out.println(tempo);
      jProgressBar1.setValue(tempo);
      System.out.println(jProgressBar1.getValue());
//System.out.println(TEMPO_MAX-(Integer.parseInt(Long.toString(temporaneo-inizio))));
      try {
        Thread.sleep(100);
      }
      catch(InterruptedException ex) {
        ex.printStackTrace();
      }
      if(b) {
        return;
      }
    }
    jButton1.setVisible(false);
    jButton2.setVisible(false);
    jButton3.setVisible(false);
    jButton4.setVisible(false);
    System.out.println("Risposta non data in tempo");
    Player.addSbagliata();
    Player.togliVita();
    EsitoRisposta.RispostaTempo(this);
  }
  void jButton1_actionPerformed(ActionEvent e) {
    int risposta =0;
    flag.setTrue();
    jButton1.setVisible(false);
    jButton2.setVisible(false);
    jButton3.setVisible(false);
    jButton4.setVisible(false);
    if(e.getSource() == jButton1)
      risposta = 1;
    if(e.getSource() == jButton2)
      risposta = 2;
    if(e.getSource() == jButton3)
      risposta = 3;
    if(e.getSource() == jButton4)
      risposta = 4;
    if(risposta == tempz.getGiusta()) {
      EsitoRisposta.RispostaCorretta(this);
      Player.addGiusta();
    }
    else {
     Player.addSbagliata();
     Player.togliVita();
     EsitoRisposta.RispostaSbagliata(this);
    }
  }
}
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);
  }
}
package ennesimaprova;
import javax.swing.*;
import java.awt.*;
import com.borland.jbcl.layout.*;
import java.awt.event.*;
/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2003</p>
 * <p>Company: </p>
 * @author not attributable
 * @version 1.0
 */
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();
  }
}

 
Non ho letto il codice, comunque per aggiornare un componente grafico come
la JProgressBar dovresti istanziare un Thread che lo faccia. In questo
modo la progressbar si aggiorna e tu puoi continuare a cliccare.
Implementa Runnable e nel metodo run() aggiorna la progressbar, per
avviare il run:
(new Thread(this)).start();
validate() riposiziona i componenti, ridimensiona la finestra e i
componenti secondo le regole del layoutmanager.
-- 
Pietro	- 
http://pietro81.altervista.org
Linux Registered User #304991
Powered by *Mandrake GNU/Linux 9.1*

Grazie mille per la risposta.
Ho risolto il problema: la GUI era congelata poichè l'aggiornamento
della jprogressbar occupava il thread eventdispatch... Quindi ho usato
swingworker!
Grazie mille comunque della risposta!