J'ai pas très bien compris ce que tu veux me dire :s
Version imprimable
J'ai pas très bien compris ce que tu veux me dire :s
Une fois que tu auras cliqué sur le bouton pour démarrer le calcul,
l'addition devra s'exécuter combien de fois par seconde ?
Le plus rapidement possible
Bon, ben, il faut mettre le code
dans le rund'une classe qui étend ThreadCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 public void run { flag = true; while (flag) { dv=dv+deltaV(); D=dv/200; Ye=Ye+D; System.out.println("Dv= "+dv); System.out.println("D= "+D); X1=calculX1(Xe,Ye); X2=calculX2(Xe,Ye); System.out.println(""+X1); System.out.println(""+X2); label2.setText("Ye= "+Ye); } }
dans cette classe il faut y ajouter un flag marche/arrêt
le Thread sera démarré par le 1er clic et le flag doit être mis à true
quand tu cliques une seconde fois, il faut que le flag soit mis à false et le thread s’arrêtera.
pour l'accès au flag depuis le bouton, tu as plusieurs solutions (getter/setter)
ou accès par une variable publique.
(oui, je sais, ce n'est pas bien mais comme il ne va pas vendre cette application sur internet ...)
Et comment on utilise un Thread je n'ai pour le moment effectuer que de petite application sans Thread ...
Tu peux déja retrouver des tutoriaux ici même en cherchant un peu :
http://java.developpez.com/faq/java/...angage_threads
http://alwin.developpez.com/tutorial/JavaThread/
http://viennet.developpez.com/cours/java/thread/
par exemple...
Aïe !Citation:
je n'ai pour le moment effectuer que de petite application sans Thread
Rappel : un Thread exécute un bout de programme indépendamment du reste de l'application.
Tu as besoin d'un Thread dans ton cas car si tu mets la boucle du programme dans ton bouton,
alors l'application va prendre la main et il n'y aura plus moyen de stopper le calcul
(ou alors de façon très imprécise).
Une fois lancé, le Thread va exécuter le programme (ici en boucle)
c'est pourquoi il faut lui mettre un flag lui indiquant qu'il doit s’arrêter.
D'accord donc si j'ai bien compris je défini ma méthode avec le Thread à l’extérieur de bouton puis j'exécute la méthode run() dans mon bouton et le tour et joué ?lol
Tu n'exécutes pas la méthode run() du Thread, mais start() qui appellera comme par magie la méthode run(). Comme expliqué dans les tutos je pense ;)
Voila le code que j'ai implenté:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 public class Souris extends Frame { int i=0; boolean flag; JToggleButton btnProduction = new JToggleButton("bouton"); Thread t; public void run(){ flag=true; while(flag){ System.out.println("i" + i); i++; } } Souris(){ setTitle("Test"); setLayout(null); setBounds(100,100,500,350); setBackground(Color.cyan); btnProduction.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (btnProduction.isSelected()) { t.start(); } else { System.out.println("FINISH");// ... j'arrête mon calcul } } }); btnProduction.setBounds(400,100,50,30); btnProduction.setBackground(Color.red); add(btnProduction); addWindowListener(new FermerFenetre()); setVisible(true); } class FermerFenetre extends WindowAdapter{ public void windowClosing(WindowEvent evt){ if(evt.getWindow().getName().equals("frame0")){ System.exit(0); }else evt.getWindow().dispose(); } } public static void main(String[] args) { // TODO Auto-generated method stub new Souris(); }
Oui, il faut créer une classe "MonCalcul" qui étend la classe Thread (voir tutos)
Quand tu cliques sur le bouton, alors un objet MonCalcul doit être créé et tu fais un MonCalcul.start() pour le lancer.
ta classes doit prévoir une méthode stopCalcul() :
Quand tu cliques pour la seconde fois,Code:
1
2
3 public void stopCalcul() { flag = false; }
cette méthode sera appelée : MonCalcul.stopCalcul()
et pourquoi ce n'est pas bon ce que j'ai fait .... je commence à ne plus savoir quoi ecrire :cry:
New code
Mais se ne fonctionne toujours pas :cry:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79 import java.awt.Color; import java.awt.Frame; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JToggleButton; public class Souris extends Frame { int i=0; boolean flag; JToggleButton btnProduction = new JToggleButton("bouton"); Souris(){ setTitle("Test"); setLayout(null); setBounds(100,100,500,350); setBackground(Color.cyan); btnProduction.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (btnProduction.isSelected()) { MonCalcul.start(); } else { Moncalcul.stopCalcul(); System.out.println("FINISH");// ... j'arrête mon calcul } } }); btnProduction.setBounds(400,100,50,30); btnProduction.setBackground(Color.red); add(btnProduction); addWindowListener(new FermerFenetre()); setVisible(true); } class FermerFenetre extends WindowAdapter{ public void windowClosing(WindowEvent evt){ if(evt.getWindow().getName().equals("frame0")){ System.exit(0); }else evt.getWindow().dispose(); } } class MonCalcul extends Thread{ public void run(){ flag=true; while(flag){ System.out.println("i= "+i); i++; } } public void stopCalcul(){ flag=false; } } public static void main(String[] args) { // TODO Auto-generated method stub new Souris(); } }
Ah les écrivains ...Citation:
je commence à ne plus savoir quoi ecrire
Bon, c'est pas mal déjà, on avance.
Tu peux poster la classe MonCalcul ?
EDIT : j'avais pas vu que tu avais fais une classe interne
elle est ecrite ligne 60 lol
C'est presque cela.
Il faut créer un objet MonCalcul qui soit un champ de classe pour qu'il soit accessible par les différentes actions du bouton.
En clair :
1) dans tes déclarations :
2) ensuite :Code:
1
2
3
4 int i=0; boolean flag; JToggleButton btnProduction = new JToggleButton("bouton"); MonCalcul monCalcul = new MonCalcul();
Code:
1
2
3
4
5
6
7
8
9
10 if (btnProduction.isSelected()) { monCalcul.start(); } else { monCalcul.stopCalcul(); System.out.println("FINISH");// ... j'arrête mon calcul }
Sa marche lol enfin presque lol si je clique sur le bouton l'application est terminé mais si je veux la relancé j'ai un probleme
Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Unknown Source)
at Souris$1.itemStateChanged(Souris.java:32)
at javax.swing.AbstractButton.fireItemStateChanged(Unknown Source)
at javax.swing.AbstractButton$Handler.itemStateChanged(Unknown Source)
at javax.swing.DefaultButtonModel.fireItemStateChanged(Unknown Source)
at javax.swing.JToggleButton$ToggleButtonModel.setSelected(Unknown Source)
at javax.swing.JToggleButton$ToggleButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Eh ben oui, c'était pour voir si tu avais eu le temps de lire la doc sur les Thread ;)
On ne peut pas relancer un Thread !
Pour la suite, j'ai besoin de savoir si lorsque tu veux relancer le calcul
est-ce qu'il repart à zéro ou bien doit-il continuer là où il en était ?
Je les vu mais après avoir poster sur le forum :D.
Donc pour répondre à ta question je dois garder les mêmes valeurs qui pourront éventuellement être utilisé pour des autres boutons
Puisque i est un champ de classe, sa valeur est conservée.
Donc on peut faire la modif suivante :
Déclarations :
Exécution :Code:
1
2
3
4 int i=0; boolean flag; JToggleButton btnProduction = new JToggleButton("bouton"); MonCalcul monCalcul;
Code:
1
2
3
4
5
6
7
8
9 if (btnProduction.isSelected()) { monCalcul = new MonCalcul(); monCalcul.start(); } else { monCalcul.stopCalcul(); System.out.println("FINISH");// ... j'arrête mon calcul }