我刚做了一个计算器应用程序,我不知道为什么按钮的名称如下:“7”,“8”,“9”,“0”,“。”。点击时不考虑它们(数字不在JLabel中写入)
这组按钮存储在我在面板中实现的表格中,希望有人能找出问题的来源
谢谢我的代码:
Public class Fenetre1 extends JFrame {
JPanel panel = new JPanel();
JPanel panel1 = new JPanel();
JLabel resultat = new JLabel("");
String[] tab_nombres = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ".", "=" };
String[] tab_operateur = { "C", "+", "-", "*", "/" };
JButton[] tab_buttons = new JButton[tab_nombres.length];
JButton[] tab_buttonsOperateur = new JButton[tab_operateur.length];
boolean operateur = false; //test the operator
boolean effacer = true; // test if JLabel is wipe off
double calcul = 0;
String signe; // stock the operator
String chaineNombre = ""; // stock first number
String chaineNombre2 = "";// stock second number
public Fenetre1() {
this.setTitle("Calculatrice");
this.setSize(400, 200);
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
resultat.setBackground(Color.BLACK);
panel.setLayout(new GridLayout(4, 3, 5, 5));
panel1.setLayout(new GridLayout(5, 1, 5, 5));
// je donne des border a mon Jlabel
resultat.setPreferredSize(new Dimension(250, 30));// dimension
Font police = new Font("Tahoma", Font.BOLD, 16); // Apparence
resultat.setBorder(BorderFactory.createLineBorder(Color.BLACK, 5));// bordure
resultat.setFont(police);
// boucle pour remplir les deux panels
for (int i = 0; i < tab_buttons.length; i++) {
tab_buttons[i] = new JButton(tab_nombres[i]);
tab_buttons[i].addActionListener(new Affichage());
panel.add(tab_buttons[i]);
}
for (int i = 0; i < tab_operateur.length; i++) {
tab_buttonsOperateur[i] = new JButton(tab_operateur[i]);
tab_buttonsOperateur[i].addActionListener(new Affichage());
panel1.add(tab_buttonsOperateur[i]);
// Grisé ces buttons tant qu'aucun nombre n'est saisie
tab_buttonsOperateur[i].setEnabled(false);
}
this.getContentPane().add(resultat, BorderLayout.NORTH);
this.getContentPane().add(panel, BorderLayout.CENTER);
this.getContentPane().add(panel1, BorderLayout.EAST);
resultat.setBorder(new EmptyBorder(5, 5, 5, 5));
panel.setBorder(new EmptyBorder(5, 5, 5, 5));
panel1.setBorder(new EmptyBorder(5, 5, 5, 5));
this.pack();
this.setVisible(true);
private class Affichage implements ActionListener {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Object source = e.getSource();
for (int i = 0; i < tab_buttons.length && i < tab_buttonsOperateur.length; i++) {
if (source == tab_buttons[11] && calcul == 0 && chaineNombre2 == "" && chaineNombre == "") {
resultat.setText("");
resultat.repaint();
break;
}
// Premier saisi d'un nombre
if (effacer == true) {
chaineNombre = ((JButton) source).getText();
resultat.setText(chaineNombre);
resultat.validate();
calcul = Double.valueOf(chaineNombre);
effacer = false;
for (int j = 0; j < tab_buttonsOperateur.length; j++) {
tab_buttonsOperateur[j].setEnabled(true);
}
break;
}
else if (((JButton) source) == tab_buttons[i] && ((JButton) source) != tab_buttonsOperateur[i]) {
// Pour concatiné les premiers nombres
if (operateur == false) {
chaineNombre = chaineNombre.concat(((JButton) source).getText());
resultat.setText(chaineNombre);
resultat.validate();
calcul = Double.valueOf(chaineNombre);
// Pour concatiné les deuxièmes nombres
} else if (operateur == true) {
chaineNombre2 = chaineNombre2.concat(((JButton) source).getText());
resultat.setText(chaineNombre2);
resultat.validate();
}
}
else if (((JButton) source) == tab_buttonsOperateur[i] && ((JButton) source) != tab_buttons[i]) {
// Pour vider le JLabel si on clique sur C
if (((JButton) source) == tab_buttonsOperateur[0]) {
resultat.setText("");
resultat.repaint();
chaineNombre = "";
chaineNombre2 = "";
effacer = true;
for (int j = 0; j < tab_buttonsOperateur.length; j++) {
tab_buttonsOperateur[j].setEnabled(false);
}
break;
} else {
// Stock operation choisis
operateur = true;
signe = tab_buttonsOperateur[i].getText();
break;
}
// Effectuer calcul selon l'operateur
} else if (operateur == true && ((JButton) source) == tab_buttons[11]) {
switch (signe) {
case "+":
calcul = calcul + Double.valueOf(chaineNombre2);
resultat.setText(String.valueOf(calcul));
resultat.validate();
operateur = false;
break;
case "-":
calcul = calcul - Double.valueOf(chaineNombre2);
resultat.setText(String.valueOf(calcul));
resultat.validate();
operateur = false;
break;
case "*":
calcul = calcul * Double.valueOf(chaineNombre2);
resultat.setText(String.valueOf(calcul));
resultat.validate();
operateur = false;
break;
case "/":
if ((((JButton) source).getText()) == "0") {
resultat.setText("dévision par 0 est impossible");
resultat.validate();
} else {
calcul = calcul / Double.valueOf(chaineNombre2);
resultat.setText(String.valueOf(calcul));
resultat.validate();
operateur = false;
}
break;
default:
resultat.setText("choisir une opération");
break;
}
chaineNombre2 = "";
}
}
}
}
}
在第27行附近,改变
JButton[] tab_buttonsOperateur = new JButton[tab_operateur.length];
至
JButton[] tab_buttonsOperateur = new JButton[tab_nombres.length];
actionPerformed()
的Affichage
方法中的最外层循环受操作符按钮数组长度的限制,即5:
i < numberButtons.length && i < opButtons.length
由于i
的限制,“6”及以上的数字按钮永远不会被处理。
这一切都源于尝试在一个巨大的方法中做所有事情的复杂性。相反,您应该有不同的侦听器来执行特定任务,并将它们添加到正确的UI控件中。