Bonjour, je suis novice en java.
Je cherche à afficher un oscillogramme 2D en java de manière dynamique, sans que l'écran de l'oscillogramme et la courbe ne saccadent.
Voici les programme en pièce jointe où j'ai le problème d'affichage:
programme MyCan.java
programme ScopeTest.java :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240 package test1; import java.awt.*; import java.awt.image.*; import java.awt.event.*; import java.awt.geom.*; import java.lang.Math.*; import javax.swing.*; import test1.MyGraph.ThreadRendering; public class MyCan extends Canvas { ThreadRendering renderingthread = new ThreadRendering(); float hauteur; float largeur; static float Vmax; float T; float X; float Y; //Vector Points; //int painted; static float n; Graphics gr; ThreadAffichage ta; public MyCan() { super(); //this.Points=Points; setBackground(Color.black); setBounds(50,10,550,380); renderingthread.start(); } public static void LVoltScale() { String lts=(String)(PanelGraphicTest.levelscale).getSelectedItem(); if(lts=="100mV/div") { Vmax=1F; } else if(lts=="200mV/div") { Vmax=0.5F; } else if(lts=="500mV/div") { Vmax=0.2F; } else if(lts=="1V/div") { Vmax=0.1F; } else if(lts=="2V/div") { Vmax=0.05F; } else if(lts=="5V/div") { Vmax=0.02F; } } public static void STimeScale() { String stc=(String)(PanelGraphicTest.timescale).getSelectedItem(); if(stc=="200µs/div") { n=0.2F; } else if(stc=="500µs/div") { n=0.5F; } else if(stc=="1ms/div") { n=1; } else if(stc=="2ms/div") { n=2; } else if(stc=="5ms/div") { n=5; } else if(stc=="10ms/div") { n=10; } else if(stc=="20ms/div") { n=20; } else if(stc=="50ms/div") { n=50; } else if(stc=="100ms/div") { n=100; } else if(stc=="200ms/div") { n=200; } } public void paint(Graphics screen) { Graphics2D screen2D = (Graphics2D)screen; hauteur = (float) getSize().height; largeur = (float) getSize().width; X=largeur/2; Y=hauteur/2; //Font font = new Font("Dialog", Font.PLAIN, 12); LVoltScale(); STimeScale(); T=largeur/n; screen2D.setColor(Color.pink); Rectangle2D.Float R1 = new Rectangle2D.Float(0F,hauteur/2,largeur,2F); screen2D.fill(R1); screen2D.draw(R1); Line2D.Float v5 = new Line2D.Float(5F*largeur/10F,0F,5F*largeur/10F,hauteur); screen2D.draw(v5); screen2D.setColor(Color.pink); Line2D.Float l1 = new Line2D.Float(0F,1F*hauteur/10F,largeur,1F*hauteur/10F); Line2D.Float l2 = new Line2D.Float(0F,2F*hauteur/10F,largeur,2F*hauteur/10F); Line2D.Float l3 = new Line2D.Float(0F,3F*hauteur/10F,largeur,3F*hauteur/10F); Line2D.Float l4 = new Line2D.Float(0F,4F*hauteur/10F,largeur,4F*hauteur/10F); Line2D.Float l6 = new Line2D.Float(0F,6F*hauteur/10F,largeur,6F*hauteur/10F); Line2D.Float l7 = new Line2D.Float(0F,7F*hauteur/10F,largeur,7F*hauteur/10F); Line2D.Float l8 = new Line2D.Float(0F,8F*hauteur/10F,largeur,8F*hauteur/10F); Line2D.Float l9 = new Line2D.Float(0F,9F*hauteur/10F,largeur,9F*hauteur/10F); screen2D.draw(l1); screen2D.draw(l2); screen2D.draw(l3); screen2D.draw(l4); screen2D.draw(l6); screen2D.draw(l7); screen2D.draw(l8); screen2D.draw(l9); Line2D.Float v1 = new Line2D.Float(1F*largeur/10F,0F,1F*largeur/10F,hauteur); Line2D.Float v2 = new Line2D.Float(2F*largeur/10F,0F,2F*largeur/10F,hauteur); Line2D.Float v3 = new Line2D.Float(3F*largeur/10F,0F,3F*largeur/10F,hauteur); Line2D.Float v4 = new Line2D.Float(4F*largeur/10F,0F,4F*largeur/10F,hauteur); Line2D.Float v6 = new Line2D.Float(6F*largeur/10F,0F,6F*largeur/10F,hauteur); Line2D.Float v7 = new Line2D.Float(7F*largeur/10F,0F,7F*largeur/10F,hauteur); Line2D.Float v8 = new Line2D.Float(8F*largeur/10F,0F,8F*largeur/10F,hauteur); Line2D.Float v9 = new Line2D.Float(9F*largeur/10F,0F,9F*largeur/10F,hauteur); screen2D.draw(v1); screen2D.draw(v2); screen2D.draw(v3); screen2D.draw(v4); screen2D.draw(v6); screen2D.draw(v7); screen2D.draw(v8); screen2D.draw(v9); float tab[]=new float[(int)largeur]; for(int i=0; i<(int)largeur; i++) tab[i]=0F; //0F; GeneralPath fsignal = new GeneralPath(); //setIgnoreRepaint(false); //repaint(); ta = new ThreadAffichage(); //System.out.println(cpt); //paint(screen); System.out.println(ActionCom.K); if(ActionCom.K==1) { //y = this.generate(0F); //fsignal.moveTo(0F,y); for(int i=0; i<(int)largeur; i++) { tab[i]=0F; } for(int i=0; i<(int)largeur; i++) { fsignal.moveTo(0F,tab[i]); } for(int i=0; i<(int)largeur; i++) { //y=this.generate(i); tab[i]=this.generate(i); } for(int i=0; i<(int)largeur; i++) fsignal.lineTo(i,tab[i]); screen2D.setColor(Color.yellow); screen2D.draw(fsignal); //repaint(); System.out.println("signal dessiné"); } else if(ActionCom.K==2){ for(int i=0; i<(int)largeur; i++) { tab[i]=0F; } for(int i=0; i<(int)largeur; i++) { fsignal.moveTo(0F,tab[i]); } screen2D.draw(fsignal); //repaint(); //validate(); System.out.println("signal efface"); } //try{Thread.sleep(0); //} //catch(Exception e){} } public float generate(float x) { //repaint(); double a = (double)(x*2F*Math.PI/T); float result=0F; result = (float)(Y-((Vmax*hauteur/2)*Math.sin(a))); return result; } class ThreadRendering extends Thread { public void run() { while(true) { try { repaint(); sleep(50); } catch(Exception ex) { System.err.println(ex); } } } } }
voici les autres programmes pour exécuter le projet :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 package test1; import java.awt.*; import java.awt.event.*; import java.awt.image.*; import java.awt.geom.*; import java.lang.Math.*; import javax.swing.*; import java.util.Vector; public class ScopeTest extends JPanel { public MyCan myc; //public MyGraph myg; public ActionCom ac; public static int n; public int i; //Graphics my_gr; //BufferStrategy my_buff_stra; //my_Thread_aff inst_my_thread; public ScopeTest() { super(); myc=new MyCan(); //myc = new MyCan(); add(myc); //add(myc); setVisible(true); //this.setIgnoreRepaint(true); } } /*ùpublic MonCaneva get_my_can(){ return can; }*/ /*public void start_buff_stra(){ if(this.isVisible()){ System.out.println(" !! visible *"); this.createBufferStrategy(2); my_buff_stra = this.getBufferStrategy(); my_gr = my_buff_stra.getDrawGraphics(); inst_my_thread = new my_Thread_aff(); inst_my_thread.start(); } else{ System.out.println(" ** pas visible *"); } }*/ /*private class my_Thread_aff extends Thread { public my_Thread_aff(){ } public void run(){ while(true){ try{Thread.sleep(40);} catch(Exception e){} my_gr.setColor(Color.blue); my_gr.fillRect(0,0,200,100); my_buff_stra.show(); } } }*/
Programme PanelGraphicTest.java
Programme PGTest.java :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
80
81
82
83 package test1; import java.awt.Color; import java.awt.Insets; import java.awt.event.*; import java.awt.*; import javax.swing.*; import javax.swing.border.BevelBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class PanelGraphicTest extends JPanel { //static PanelGraphicTest _instance = null; //private Test test; private ScopeTest oscillo; public static JButton jbGenerate; public static JButton jbStop; public static TimeScale timescale; public static LevelScale levelscale; public static ChoiceSignals chsi; int[] tabData1; Graphics buffer; protected PanelGraphicTest() { this.setLayout(null); oscillo = new ScopeTest(); oscillo.setSize(607, 431); oscillo.setLocation(132,138); jbGenerate = new JButton(); jbGenerate.setSize(80,23); jbGenerate.setLocation(5,5); jbGenerate.setMargin(new Insets(2,2,2,2)); jbGenerate.setVisible(true); jbGenerate.setText("Generate"); jbGenerate.addActionListener(new ActionCom(1)); jbStop = new JButton(); jbStop.setSize(80,23); jbStop.setLocation(5,5); jbStop.setMargin(new Insets(2,2,2,2)); jbStop.setVisible(false); jbStop.setText("Stop"); jbStop.addActionListener(new ActionCom(2)); timescale = new TimeScale(false,"200µs/div","500µs/div","1ms/div","2ms/div","5ms/div","10ms/div","20ms/div","50ms/div", "100ms/div", "200ms/div"); timescale.setSize(90,23); timescale.setLocation(5,50); timescale.setVisible(true); timescale.addActionListener(new ActionCmd(1)); levelscale = new LevelScale(false,"100mV/div","200mV/div","500mV/div","1V/div","2V/div","5V/div"); levelscale.setSize(100,23); levelscale.setLocation(100,50); levelscale.addActionListener(new ActionCmd(2)); chsi = new ChoiceSignals(false,"sinus","carré","triangle","rampe"); chsi.setSize(80,23); chsi.setLocation(5,80); chsi.addActionListener(new ActionCmd(3)); this.add(oscillo, null); this.add(jbGenerate, null); this.add(jbStop, null); this.add(timescale,null); this.add(levelscale, null); this.add(chsi, null); this.setVisible(true); } /*public static PanelGraphicTest getInstance() { return(_instance == null) ? _instance = new PanelGraphicTest() : _instance; }*/ /*class ActionGenerate implements ActionListener { public void actionPerformed(ActionEvent ae) { test.repaint(); }*/ }
Programme FGTest.java :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 package test1; import java.awt.*; import javax.swing.*; public class PGTest extends JPanel { BorderLayout borderlayout1 = new BorderLayout(); JTabbedPane jscrollPanel = new JTabbedPane(); PanelGraphicTest panelGT = new PanelGraphicTest(); public PGTest() { try { this.setLayout(borderlayout1); jscrollPanel.setForeground(java.awt.Color.blue); jscrollPanel.add(panelGT); this.add(jscrollPanel,java.awt.BorderLayout.CENTER); this.setVisible(true); } catch(Exception ex) { ex.printStackTrace(); } } }
Voici les programme d'actionlistener et principaux :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 package test1; import java.awt.*; import javax.swing.*; public class FGTest extends JFrame { JPanel contentPane; BorderLayout borderlayout1 = new BorderLayout(); PGTest pgtest7 = new PGTest(); public FGTest() { try { setDefaultCloseOperation(EXIT_ON_CLOSE); contentPane=(JPanel)getContentPane(); contentPane.setLayout(borderlayout1); setSize(new Dimension(1300,900)); setTitle("Test"); contentPane.add(pgtest7,java.awt.BorderLayout.CENTER); this.setVisible(true); } catch (Exception exception) { exception.printStackTrace(); } } }
Programme Appli.java :
programme ActionCom.java :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 package test1; import javax.swing.*; /** * <p>Title: OUTILS PG5</p> * <p>Description: MMI for Sonar Application</p> * <p>Copyright: Copyright (c) 2005</p> * <p>Company: THALES UNDERWATER SYSTEM</p> * @author PG5 * @version 1.0 */ public class Appli extends JFrame { /** * Set the Main Frame * */ public Appli() { FGTest frame = new FGTest(); frame.validate(); frame.setSize(900,900); frame.setResizable(true); pack(); frame.setVisible(true); } public static void main(String[] args) { new Appli(); } }
programme ActionCmd.java:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 package test1; import java.awt.event.*; import javax.swing.*; import java.io.IOException; public class ActionCom implements ActionListener { private int c; public static int K,L; public boolean finacq; public MyCan mc; //public ThreadRendering tr; public ActionCom(int c) { this.c=c; mc = new MyCan(); } public void actionPerformed(ActionEvent ae) { //sc1.repaint(); //TA = new ThreadAffichage(); //sc1.get_my_can().start_buff_stra(); switch(c) { case 1: K=c; System.out.println(K); //finacq=false; PanelGraphicTest.jbGenerate.setVisible(false); PanelGraphicTest.jbStop.setVisible(true); //sc1.repaint(); mc.renderingthread.start(); mc.repaint(); //TA.start(); break; case 2: K=c; System.out.println(K); //finacq=true; PanelGraphicTest.jbStop.setVisible(false); PanelGraphicTest.jbGenerate.setVisible(true); //sc1.repaint(); //TA.interrupt(); mc.renderingthread.interrupt(); mc.repaint(); break; default: break; } } }
Et Pour finir, voici les programmes LevelScale.java et TimeScale.java :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 package test1; import java.awt.event.*; import javax.swing.*; public class ActionCmd implements ActionListener { private int a; public ActionCmd(int a) { this.a=a; } public void actionPerformed(ActionEvent ae) { switch(a) { case 1: MyCan.STimeScale(); break; case 2: MyCan.LVoltScale(); break; //case 3: // MonCaneva.TChoiceSignals(); // break; } } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package test1; import javax.swing.JComboBox; public class LevelScale extends JComboBox { public LevelScale(boolean b, String l0, String l1, String l2, String l3, String l4, String l5) { setEditable(b); addItem(l0); addItem(l1); addItem(l2); addItem(l3); addItem(l4); addItem(l5); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package test1; import javax.swing.JComboBox; public class TimeScale extends JComboBox { public TimeScale(boolean b, String t0, String t1, String t2, String t3, String t4, String t5, String t6, String t7, String t8, String t9) { setEditable(b); addItem(t0); addItem(t1); addItem(t2); addItem(t3); addItem(t4); addItem(t5); addItem(t6); addItem(t7); addItem(t8); addItem(t9); } }
Partager