Correction d'une classe

larecrue Messages postés 13 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 12 décembre 2008 - 10 mars 2005 à 21:57
wildcat31 Messages postés 46 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 28 août 2005 - 11 mars 2005 à 14:40
Bonjour, j'ai un problème et je galère dessus depuis une semaine, ca me prend la tete.
Voila le source simplifier de ce que je veux faire, aidez moi s'il vous plait.
Si vous pouviez trouver l'erreur qui fait que ca marche pas sans changer tout le programme de fond en comble, vous seriez trop trop gentil.
Merci par avance.
---------------------------------------------------------------------------------------------

import java.awt.* ;

import javax.swing.* ;

import java.awt.event.*;

public class Foutu extends JFrame implements ActionListener {

public JProgressBar progressBar ;

public static JButton button;

private JFrame comp;

public static boolean start=false;

public Foutu() {

comp =
new JFrame ("Ca marche pas" );

comp.addWindowListener(

new WindowAdapter(){

public void windowClosing(WindowEvent e){
System.exit(0);
}
});

comp.setBounds(400,200,300,351);
comp.getContentPane().setLayout(
null);
comp.setResizable(
false);

progressBar =
new JProgressBar( 0 , 1000 ) ;
progressBar.setStringPainted(
true ) ;
progressBar.setValue( 0 ) ;

button =
new JButton("compte" ) ;
button.addActionListener(
this ) ;

progressBar.setBounds(6, 296, 282, 20);
button.setBounds(80, 250, 140, 42);

comp.getContentPane().add(progressBar);
comp.getContentPane().add(button);

comp.setVisible(
true);

}

public void setBar(int value){
System.out.println(
"Valeur: "+value);
progressBar.setValue(value);
progressBar.repaint();
}

public void actionPerformed( ActionEvent e ) {

if (e.getSource()==button){

button.setEnabled(
false);

setBar( 250 ) ;

try { Thread.sleep(1000);
}
catch(InterruptedException ie) {}

setBar( 500 ) ;

try { Thread.sleep(1000);
}
catch(InterruptedException ie) {}

setBar( 750 ) ;

try { Thread.sleep(1000);
}
catch(InterruptedException ie) {}

setBar( 1000 ) ;

comp.dispose();

}
}

public static void main(String[] args){
Foutu index =
new Foutu();
}

}
<RX>

4 réponses

wildcat31 Messages postés 46 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 28 août 2005 3
11 mars 2005 à 08:46
Bonjour,

J'ai eu ce problème un jour.
Voici le commentaire d'un tutorial qui ressemblait beaucoup au tien :



Si vous lancez cette application vous pourrez constater un certain nombre de choses.




<LI>La barre de progression n'avance pas.
<LI>La console affiche bien les points ce qui indique que le traitement s'effectue.
<LI>Si vous agrandissez la fenêtre pendant le traitement, celle-ci ne se rafraîchie pas.
<LI>A la fin du traitement, la barre de progression affiche 100% et la fenêtre se redessine correctement. </LI>



En introduction de ce chapitre, nous disions que les événements ne devaient être dépilés que " un par un ".
Dans notre exemple, le premier événement explicitement dépilé est celui du bouton. Tant que le code du bouton n'est pas terminé, aucun autre événement ne sera dépilé !
Du coup, à chaque modification de l'état de la barre de progression, l'événement lié au rafraîchissement du composant graphique est empilé et attend que le code du bouton soit achevé pour être dépilé à son tour.

La solution est donc de faire un thread :
public void actionPerformed( ActionEvent e ) {
new Thread() {
public void run ( )
{
button.setEnabled( false);

setBar( 250 ) ;

try { Thread.sleep(1000);
} catch(InterruptedException ie) {}

setBar( 500 ) ;

try { Thread.sleep(1000);
} catch(InterruptedException ie) {}

setBar( 750 ) ;

try { Thread.sleep(1000);
} catch(InterruptedException ie) {}

setBar( 1000 ) ;

comp.dispose();
}
}.start();
}

Par contre j'ai enlevé la boucle avec e.getSource()==button parce que ça me faisait une erreur, et j'ai eu la flemme d'y réfléchir, et puis c'était pas ça ton problème.

Bon courage
Wildcat
0
wildcat31 Messages postés 46 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 28 août 2005 3
11 mars 2005 à 08:53
Par ailleurs, tu n'as pas besoin de faire repaint sur la progress bar.
J'ai vu aussi que ta classe étendait JFrame, alors qu'ensuite tu définissait comp comme JFrame, et tu ne te servait pas du fait que Foutu était une JFrame. Mais bon, comme tu l'as dit, c'est une version simplifiée de ton programme, tu t'en sert peut-être ailleurs.

Bon courage Wildcat
0
larecrue Messages postés 13 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 12 décembre 2008
11 mars 2005 à 14:17
Merci de ta reponse si rapide, je vais tester ca dans mon vrai programme, merci pour tes precieux conseils, j'essaye de faire un programme propre et je fais n'importe quoi des fois.
Mon comp en fait je m'en suis servis mais j'ai oublie de l'enlever.
Et ton tutorial a l'air pas mal, tu pourrais me donner l'addresse, je me tape que des docs et tutos en anglais quand je suis en galere, c'est pas tres pratique meme si je me demerde pas mal.

Encore merci.
0
wildcat31 Messages postés 46 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 28 août 2005 3
11 mars 2005 à 14:40
Avec plaisir !

Le tutoriel était en fait pas exceptionnel, sauf sur le problème que tu as eu. Mais sur le même site il y en a pleins d'autres (ça va faire un peu de concurrence à ce site...). Voici l'adresse :
http://alwin.developpez.com/tutorial/JavaThread/

Bon développement !
Wildcat
0
Rejoignez-nous