我在GUI上遇到了一些错误

时间:2014-11-10 13:10:00

标签: java swing user-interface jframe

我在制作计算器程序时遇到了一些错误,我尝试过很多东西,但没有任何效果,我的错误就是。

  1. 当您点击任意数字按钮时,它会继续使用默认值零(“0是我的计算器的默认文本”)
  2. 当你在计算器中插入一个数字并且文本字段有一个旧答案时,你按下的数字将添加到你得到的答案中。
  3. 请帮忙!

    import javax.swing.*;
    import java.math.*;
    import java.awt.*;
    import java.awt.event.*;
    
    public class Calculator extends JPanel implements ActionListener {
    
        // ***************** VARIABLES ********************************************
        private GridBagLayout layout;
        private GridBagConstraints gbc;
    
        private JButton [] numberButtons;
        private JButton [] otherButtons;
    
        private JTextField field;
    
        private double num1, num2, total;
        private int operator;
    
        // ***************** ORDERING BUTTONS ***************************************
        // [0]=gridx(column), [1]=gridy(row), [2]=gridwidth, [3]=gridheight
    
        // Number buttons
        private int [] [] numConstraints = new int [] [] {
            {0, 5, 2, 1}, // 0
            {0, 4, 1, 1}, // 1
            {1, 4, 1, 1}, // 2
            {2, 4, 1, 1}, // 3
            {0, 3, 1, 1}, // 4
            {1, 3, 1, 1}, // 5
            {2, 3, 1, 1}, // 6
            {0, 2, 1, 1}, // 7
            {1, 2, 1, 1}, // 8
            {2, 2, 1, 1}, // 9
        };
    
        // [0]=gridx(column), [1]=gridy(row), [2]=gridwidth, [3]=gridheight
        // Other buttons
        private int [] [] otherConstraints = new int [] [] {
            {2, 5, 1, 1}, // .
            {4, 4, 1, 2}, // =
            {3, 5, 1, 1}, // +
            {3, 4, 1, 1}, // -
            {3, 3, 1, 1}, // *
            {3, 2, 1, 1}, // '/'
            {2, 1, 1, 1}, // +/-
            {1, 1, 1, 1}, // C
            {4, 2, 1, 1}, // %
            {4, 1, 1, 1}, // ?
            {3, 1, 1, 1}, // ^2
            {0, 1, 1, 1}, // ?
            {4, 3, 1, 1}, // 1/x
        };
    
        // ***************** CONSTRUCTORS
        // *******************************************
        public Calculator() {
    
            // Define Layout
            layout = new GridBagLayout();
            layout.columnWidths = new int [] {60, 60, 60, 60, 60}; // 5 button columns and size
            layout.rowHeights = new int [] {60, 60, 60, 60, 60, 60}; // 6 button rows and size
            setLayout(layout);
    
            gbc = new GridBagConstraints();
    
            // Number Buttons display
            numberButtons = new JButton [10];
    
            for (int i = 0 ; i < numberButtons.length ; i++) {
                numberButtons[i] = new JButton("" + i);
                numberButtons[i].addActionListener(this); // allow button to be listened
    
                gbc.gridx = numConstraints[i][0]; // column **ALL THESE ALREADY
                                                  // DEFINED ABOVE**
                gbc.gridy = numConstraints[i][1]; // row
                gbc.gridwidth = numConstraints[i][2]; // width
                gbc.gridheight = numConstraints[i][3]; // height
                gbc.fill = GridBagConstraints.BOTH; // Take complete cell space
                gbc.insets = new Insets(2, 2, 2, 2); // padding
    
                add(numberButtons[i], gbc); // add the buttons
            }
    
            // Other Butttons incl. operators
            otherButtons = new JButton [13];
            otherButtons[0] = new JButton(".");
            otherButtons[1] = new JButton("=");
            otherButtons[2] = new JButton("+");
            otherButtons[3] = new JButton("-");
            otherButtons[4] = new JButton("x");
            otherButtons[5] = new JButton("÷");
            otherButtons[6] = new JButton("±");
            otherButtons[7] = new JButton("C");
            otherButtons[8] = new JButton("%");
            otherButtons[9] = new JButton("?");
            otherButtons[10] = new JButton("^2");
            otherButtons[11] = new JButton("?");
            otherButtons[12] = new JButton("1/x");
    
            for (int i = 0 ; i < otherButtons.length ; i++) {
                gbc.gridx = otherConstraints[i][0];
                gbc.gridy = otherConstraints[i][1];
                gbc.gridwidth = otherConstraints[i][2];
                gbc.gridheight = otherConstraints[i][3];
    
                otherButtons[i].addActionListener(this);
    
                add(otherButtons[i], gbc);
    
            }
    
            // Display text field
            field = new JTextField(); // define field
            field.setBorder(BorderFactory.createLineBorder(Color.BLACK)); // set border color to black
            field.setEditable(false); // cannot be edited
            field.setFont(new Font("Arial", Font.PLAIN, 26)); // font style and size
            field.setHorizontalAlignment(field.RIGHT);
            field.setText("0");
            gbc.gridx = 0; // column
            gbc.gridy = 0; // row
            gbc.gridwidth = 5; // width
            gbc.gridheight = 1; // height
    
            add(field, gbc); // add the field
    
        }
    
        // Action Events for each button
        public void actionPerformed(ActionEvent e) { // e can be any name
    
            // for number buttons pressed, display to the field
            for (int i = 0 ; i < numberButtons.length ; i++) {
                if (e.getSource() == numberButtons[i]) {
                    field.setText(field.getText() + i); // settext=set to field, gettext=get pressed key from i
                }
            }
    
            if (e.getSource() == otherButtons[0] && !field.getText().contains(".")) { // if current number is 0 and if decimal is
                field.setText(field.getText() + "."); // already added, another decimal cannot be added
            }
    
            if (e.getSource() == otherButtons[6]) { // 6 is +/- (change vslue to positive or negative)
                field.setText("" + (-1 * Integer.parseInt(field.getText()))); // multiply by negative 1 to change value
            }
    
            if (e.getSource() == otherButtons[7]) { // 7 is C (clear)
                field.setText("0"); // if pressed clear everything
            }
    
            if (e.getSource() == otherButtons[2]) { // 2 is +
                num1 = Integer.parseInt(field.getText());
                operator = 2;
                field.setText("");
            }
    
            if (e.getSource() == otherButtons[3]) { // 3 is -
                num1 = Integer.parseInt(field.getText());
                operator = 3;
                field.setText("");
            }
    
            if (e.getSource() == otherButtons[4]) { // 4 is *
                num1 = Integer.parseInt(field.getText());
                operator = 4;
                field.setText("");
            }
    
            if (e.getSource() == otherButtons[5]) { // 5 is /
                num1 = Integer.parseInt(field.getText());
                operator = 5;
                field.setText("");
            }
    
            if (e.getSource() == otherButtons[10]) { // 10 is ^2
                num1 = Integer.parseInt(field.getText());
                field.setText("" + (num1 * num1));
            }
    
            if (e.getSource() == otherButtons[12]) { // 12 is 1/x
                num1 = Integer.parseInt(field.getText());
                field.setText("" + (1 / num1));
            }
    
            if (e.getSource() == otherButtons[9]) { // 9 is ?
                num1 = Integer.parseInt(field.getText());
                field.setText("" + (Math.sqrt(num1)));
            }
    
            if (e.getSource() == otherButtons[8]) { // 8 is %
                num1 = Integer.parseInt(field.getText());
                field.setText("");
                num2 = Integer.parseInt(field.getText());
                field.setText("" + num1 * (num2 / 100));
            }
    
            if (e.getSource() == otherButtons[1]) { // if = button pressed:
                num2 = Integer.parseInt(field.getText()); // set num2 to new entered number
    
                // if = is pressed and if:
                if (operator == 2) {
                    total = num1 + num2;
                }
                else if (operator == 3) {
                    total = num1 - num2;
                }
                else if (operator == 4) {
                    total = num1 * num2;
                }
                else if (operator == 5) {
                    total = num1 / num2;
                }
    
                else {
                    field.setText("");
                }
    
                operator = 0; // if = is pressed but no operator inserted
                field.setText("" + total); // display result
    
            }
    
        }
    
        // ***************** MAIN METHOD
        // ********************************************
        public static void main(String [] args) {
            JFrame frame = new JFrame("Calculator");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setResizable(false);
            frame.setLayout(new BorderLayout());
            frame.add(new Calculator(), BorderLayout.CENTER);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
            // frame.setSize(320, 400); //width, height
    
        }
    
    }
    

1 个答案:

答案 0 :(得分:0)

在计算总数的total语句之前,

if应该是一个初始化为0的局部变量。

清除总数

private boolean clearOnKeyPress = false;

    double total = 0;
    if ...
    clearOnKeyPress = true;
    operator = 0;
    field.setText("" + total); //display result

不附加到0:

    if (e.getSource() == numberButtons[i]) {
        if (clearOnKeyPress || field.getText().equals("0")) {
            field.setText(""):
            clearOnKeyPress = false;
        }
        field.setText(field.getText() + i);
    }

另一种没有布尔标志的方法是在数字按下使用field.selectAll()' selecting the entire total, and field.cut()`,删除任何选择。