Bonjour,
Je débute en Java et j'ai fait une petite calculatrice. J'ai 2 JPanels dans un JSplitPane.
JPanel 1: écran: pas de boutons, repaint() fréquents
JPanel 2: boutons: contient des boutons mais jamais repaint()
Le soucis c'est que quand je clique sur les boutons du panel 2, je vois des boutons non cliquables apparaître dans le panel 1 :/
De plus, la réactivité des boutons du panel du bas augmente avec le temps d'utilisation, j'ai l'impression qu'a chaque repaint les boutons sont construits dans les 2 panels....
Pourquoi ?
Svp j'ai besoin de votre aide, parce que ça réduit vraiment la réactivité des boutons après un certain nombre de clics x)
Voici le code:
(J'ai mis une ligne en commentaire dans Panneau.java (ligne 26) pour qu'on voie les boutons apparaître, sinon ils sont la mais instantanément cachés)
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 public class Main { private static String currentNumber = "0"; private static String savedNumber = ""; private static String disp2 = ""; private static Fenetre fen = new Fenetre(); private static int operation = 0; public static void main(String[] args) { fen.setVisible(true); } public static void buttonClick(int buttonID) { switch (buttonID) { case -2: reset(); break; case -1: removeNumber(); break; case 10: addVirgule(); break; case 20: invertSign(); break; case 100: calculate(); break; default: if(buttonID >= 0 && buttonID <= 9) addNumber(buttonID); if(buttonID >= 11 && buttonID <= 14) operation(buttonID); } } private static void addNumber(int number) { if(currentNumber != "0") currentNumber += String.valueOf(number); else currentNumber = String.valueOf(number); fen.updateDisp(currentNumber, disp2); } private static void removeNumber() { if(currentNumber.length() == 1) currentNumber = "0"; else currentNumber = currentNumber.substring(0, currentNumber.length()-1); fen.updateDisp(currentNumber, disp2); } private static void addVirgule() { currentNumber += "."; fen.updateDisp(currentNumber, disp2); } private static void operation(int id) { disp2 = currentNumber; savedNumber = currentNumber; operation = id - 10; switch (operation) { case 1: disp2 += " +"; break; case 2: disp2 += " *"; break; case 3: disp2 += " -"; break; case 4: disp2 += " /"; break; default:; } currentNumber = "0"; fen.updateDisp(currentNumber, disp2); } private static void calculate() { boolean error = false; switch (operation) { case 1: currentNumber = String.valueOf(Double.valueOf(savedNumber) + Double.valueOf(currentNumber)); break; case 2: currentNumber = String.valueOf(Double.valueOf(savedNumber) * Double.valueOf(currentNumber)); break; case 3: currentNumber = String.valueOf(Double.valueOf(savedNumber) - Double.valueOf(currentNumber)); break; case 4: if(Double.valueOf(currentNumber) != 0) currentNumber = String.valueOf(Double.valueOf(savedNumber) / Double.valueOf(currentNumber)); else { fen.error("Division par zéro impossible !"); error = true; } break; default:; } if(!error) { savedNumber = ""; disp2 = ""; fen.updateDisp(currentNumber, ""); } } private static void reset() { currentNumber = "0"; savedNumber = ""; disp2 = ""; fen.updateDisp("0", ""); } private static void invertSign() { if(currentNumber.charAt(0) == '-') currentNumber = currentNumber.substring(1, currentNumber.length()); else currentNumber = "-" + currentNumber; fen.updateDisp(currentNumber, disp2); } }
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 import java.awt.Container; import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JSplitPane; public class Fenetre extends JFrame { private static final long serialVersionUID = 8164118974463460991L; private Panneau pan = new Panneau(); public Fenetre() { this.setTitle("Calculatrice"); this.setSize(400, 500); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setResizable(false); Container cont = new JSplitPane(JSplitPane.VERTICAL_SPLIT); ((JSplitPane) cont).setEnabled(false); ((JSplitPane) cont).setDividerLocation(80); cont.add(pan); cont.add(panneauBouttons()); this.getContentPane().add(cont); } private static JPanel panneauBouttons() { JPanel p = new JPanel(); GridLayout gl = new GridLayout(); gl.setColumns(4); gl.setRows(5); p.setLayout(gl); p.add(new Bouton(-10, "")); p.add(new Bouton(20, "+/-")); p.add(new Bouton(-2, "C")); p.add(new Bouton(-1, "<")); p.add(new Bouton(7, "7")); p.add(new Bouton(8, "8")); p.add(new Bouton(9, "9")); p.add(new Bouton(11, "+")); p.add(new Bouton(4, "4")); p.add(new Bouton(5, "5")); p.add(new Bouton(6, "6")); p.add(new Bouton(12, "*")); p.add(new Bouton(1, "1")); p.add(new Bouton(2, "2")); p.add(new Bouton(3, "3")); p.add(new Bouton(13, "-")); p.add(new Bouton(0, "0")); p.add(new Bouton(10, ".")); p.add(new Bouton(100, "=")); p.add(new Bouton(14, "/")); return p; } public void updateDisp(String newDisp, String disp2) { pan.updateDisp(newDisp, disp2); } public void error(String message) { pan.error(message); } }
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 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import javax.swing.JPanel; public class Panneau extends JPanel { private static final long serialVersionUID = 3153962253715907216L; private String display = new String(); private String display2 = new String(); Font Prim = new Font("Arial", Font.PLAIN, 16); Font Sec = new Font("Arial", Font.PLAIN, 12); public Panneau() { } public void paintComponent(Graphics g) { //g.clearRect(0, 0, 500, 100); g.setFont(Prim); g.setColor(Color.black); g.drawString(display, 350 - (g.getFontMetrics().stringWidth(display)), 60); g.setFont(Sec); g.setColor(Color.gray); g.drawString(display2, 300 - (g.getFontMetrics().stringWidth(display2)), 20); } public void updateDisp(String newDisp, String disp) { this.display = newDisp; this.display2 = disp; this.repaint(); } public void error(String message) { this.display = message; this.repaint(); } }Voila, dites moi si vous arrivez a reproduire le bug même si je ne pense pas être le seul chez qui ça arrive...
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 import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JButton; public class Bouton extends JButton implements MouseListener { private static final long serialVersionUID = -8525715718794492788L; public int buttonID; /* * -2: tout effacer * -1: effacer * 0 a 9: nombres * 10: . * 11: + * 12: * * 13: - * 14: / * 20: +/- * 100: = * */ public Bouton(int id, String name) { this.setText(name); this.addMouseListener(this); this.buttonID = id; } public void mouseClicked(MouseEvent arg0) { Main.buttonClick(this.buttonID); } public void mouseEntered(MouseEvent arg0) { } public void mouseExited(MouseEvent arg0) { } public void mousePressed(MouseEvent arg0) { } public void mouseReleased(MouseEvent arg0) { } }
J'obtiens ça:
Les nombres ne s'affichent pas bien mais c'est normal, j'ai retiré la ligne qui vide l'écran avant de réécrire (pour qu'on voie le bug): ligne 24 sur Panneau.java
Merci d'avance
Partager