Bonjour à tous,
voici mon 'tit problème, je suis en train de faire une interface graphique en utilisant le double buffering software et tout va nickel ! Sauf qu'à force de rajouter des composants, çà commence à ramer méchament... Et il faut pas !
Je voulais donc essayer le double buffering hardware pour voir si çà arrangeait un peu les choses, et là, c'est le drame, çà marche pas !
Ma fenêtre principale qui contient des boutons et des composants divers, ici un cadran (sorte de compte tours) :
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 public class JFenetre implements ActionListener { JFrame f; Container contentPane; JButton start, quit, pause; JGraphe graphe1, graphe2; JCadran cadran1; int hauteur,largeur; int hauteur_Cadran, largeur_Cadran; Font police_boutons; public JFenetre(LectureCSV lect){ lectCSV = lect; f = new JFrame(); f.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { System.out.println("exit"); System.exit(0); } } ); hauteur = 600; largeur = 800; if(largeur>=1000) police_boutons = new Font("Dialog", 1, 16); if(largeur>=800) police_boutons = new Font("Dialog", 1, 12); if(largeur<800) police_boutons = new Font("Dialog", 1, 8); largeur_Cadran = hauteur/4; hauteur_Cadran = hauteur/4; contentPane = f.getContentPane(); contentPane.setLayout(null); f.setSize(largeur, hauteur); f.setLocation(0, 0); f.setTitle("TESTS IHM"); start = new JButton(); start.setFont(police_boutons); start.setText("START"); start.setSize(largeur/10, hauteur/30); start.setLocation((largeur/13), hauteur-(hauteur/9)); start.addActionListener((ActionListener) this); contentPane.add(start); quit = new JButton(); quit.setFont(police_boutons); quit.setText("QUIT"); quit.setSize(largeur/10, hauteur/30); quit.setLocation((largeur/5), hauteur-(hauteur/9)); quit.addActionListener((ActionListener) this); contentPane.add(quit); pause = new JButton(); pause.setFont(police_boutons); pause.setText("PAUSE"); pause.setSize(largeur/10, hauteur/30); pause.setLocation((largeur/3), hauteur-(hauteur/9)); pause.addActionListener((ActionListener) this); contentPane.add(pause); cadran1 = new JCadran(lectCSV.map.get("NUM1"),largeur_Cadran,hauteur_Cadran,lectCSV.map.periode_acqui,0, 30700); cadran1.setLocation(largeur/2+20,0); cadran1.setSize(largeur_Cadran,hauteur_Cadran); cadran1.setVisible(true); contentPane.add(cadran1); new Thread(cadran1).start(); f.setVisible(true); } public void actionPerformed(final ActionEvent e) { Thread t = new Thread(){ public void run() { if( (e.getSource() == start) && (!lectCSV.reading) ){ System.out.println("START !!!"); lectCSV.reading = true; lectCSV.run(); } if(e.getSource() == pause){ if(lectCSV.reading ){ System.out.println("PAUSE"); lectCSV.reading = false; } else{ System.out.println("REPRISE"); lectCSV.reading = true; } } if(e.getSource() == quit){ System.out.println("QUIT"); System.exit(0); } } }; t.start(); } }
Ma classe Cadran, ici en double buffering software (version qui marche)
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 public class JCadran extends Canvas implements Runnable{ Param param; int largeur, hauteur; Image image; Graphics2D buffer; public JCadran(Param param,int largeur, int hauteur, int periode_acqui, double ValMin, double ValMax){ setBackground(Color.lightGray); //des initialisations en masse } public void update(Graphics g){ paint(g); } public void paint( Graphics g ){ //création du buffer s'il n'existe pas if(buffer==null){ image = createImage(largeur,hauteur); buffer = (Graphics2D) image.getGraphics(); } buffer.setColor( Color.lightGray ); buffer.fillRect( 0, 0, largeur, hauteur ); // Affichage des graduations DecimalFormat f = new DecimalFormat(); f.setMaximumFractionDigits(3); for(int i=0; i<=10; i++){ buffer.drawLine(X1[i], Y1[i], X2[i], Y2[i]); buffer.drawString(f.format(ValMax-(i*Val_grad)), Xt[i], Yt[i]); } // buffer.drawPleinDeTrucs ... g.drawImage(image, 0, 0, this); } public void run() { while(true){ try { repaint(); Thread.sleep( (long) (periode_acqui/1.5) ); } catch ( Exception e ) {} } } }
Et enfin, ma tentative de double buffering hardware:
Et donc l'erreur que çà me renvoie :
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 public class JCadran extends JFrame implements Runnable{ Param param; int largeur, hauteur; public BufferStrategy strategy ; public Graphics2D buffer ; public JCadran(Param param,int largeur, int hauteur, int periode_acqui, double ValMin, double ValMax){ setIgnoreRepaint(true); createBufferStrategy(2); strategy = getBufferStrategy(); buffer = (Graphics2D)strategy.getDrawGraphics() ; } public void aff(){ buffer.setColor( Color.lightGray ); buffer.fillRect( 0, 0, largeur, hauteur ); // Affichage des graduations DecimalFormat f = new DecimalFormat(); f.setMaximumFractionDigits(3); for(int i=0; i<=10; i++){ buffer.drawLine(X1[i], Y1[i], X2[i], Y2[i]); buffer.drawString(f.format(ValMax-(i*Val_grad)), Xt[i], Yt[i]); } strategy.show(); public void run() { while(true){ try { aff(); Thread.sleep( (long) (periode_acqui/1.5) ); } catch ( Exception e ) {} } } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Exception in thread "main" java.lang.IllegalStateException: Component must have a valid peer at java.awt.Component$FlipBufferStrategy.createBuffers(Unknown Source) at java.awt.Component$FlipBufferStrategy.<init>(Unknown Source) at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Unknown Source) at java.awt.Component.createBufferStrategy(Unknown Source) at java.awt.Window.createBufferStrategy(Unknown Source) at java.awt.Component.createBufferStrategy(Unknown Source) at java.awt.Window.createBufferStrategy(Unknown Source) at IHM.JCadran.<init>(JCadran.java:62) at IHM.JFenetre.<init>(JFenetre.java:102) at LectureCSV.Main.main(Main.java:14)
Ok je sais, çà fait pas mal de code, mais j'ai essayé de simplifier au max en virant ce qui n'était pas essentiel...
Sur le principe, çà à l'air tout con, on dirait que çà marche pareil que le softaware, mais en pratique, çà fait la journée que je galère dessus...
C'est pourquoi un 'tit coup de pouce serait le bienvenu...
Merci d'avance !
Partager