为什么不考虑单击某些按钮?

时间:2019-04-18 00:08:20

标签: java swing jbutton

我刚刚制作了一个计算器应用程序,我不知道为什么按钮具有以下名称:“ 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 = "";
            }

        }

    }

}

}

2 个答案:

答案 0 :(得分:0)

围绕27号线,更改

    JButton[] tab_buttonsOperateur = new JButton[tab_operateur.length];

    JButton[] tab_buttonsOperateur = new JButton[tab_nombres.length];

答案 1 :(得分:0)

actionPerformed()的{​​{1}}方法中最外面的循环受操作员按钮数组的长度限制,即5:

Affichage

由于对i < numberButtons.length && i < opButtons.length 的限制,从不处理“ 6”及以上的数字按钮。

这一切都源于尝试用一种巨大的方法来完成所有事情的复杂性。相反,您应该具有不同的侦听器来执行特定任务,并将其添加到正确的UI控件中。