在 Java 挥杆计算器中保存 3 个事件

Save 3 event in Java Swing Calculator

我是 Java 的新学生。我们的教授要求我们使用按键创建一个计算器。

说明如下:
运行 程序。用户只能使用键盘输入数字。输入第一个数字后,您可以 仅使用 4 个按钮 select 所需的操作。按下按钮后,可以进入第二个 数字。按 SOLVE 按钮将答案显示到文本字段中。

我的问题是如何保存另外两个命令以用于求解。

num1 的示例 我当时使用了 5(运算符,然后是 num2)。我怎样才能保存它们以在解决按钮中使用。这让我感到困惑,因为那里只有一个文本框。 我尝试使用以下代码的两个文本框。可以用,但是有一个盒子失败了。

int a = Integer.parseInt(textFirst.getText());
int b = Integer.parseInt(textSecond.getText());
int c = 0;
if (e.getSource().equals(btnMulti)) {
c = a * b;
textResult.setText(String.valueOf("The product of "+a+" * "+b+" is "+c));
}

到目前为止,这是我的代码;

package first_Lab_2022;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.SwingConstants;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Lab3_2 {

    private JFrame frame;
    private JTextField textField;
    
    int num1,num2 = 0;
    String operator="";

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Lab3_2 window = new Lab3_2();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public Lab3_2() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.getContentPane().addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                
            }
        });
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        
        textField = new JTextField();
        textField.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                num1 = Integer.parseInt(textField.getText());
            }
        });
        textField.setHorizontalAlignment(SwingConstants.RIGHT);
        textField.setBounds(114, 73, 242, 60);
        frame.getContentPane().add(textField);
        textField.setColumns(10);
        
        JButton btnAdd = new JButton("Add");
        btnAdd.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                textField.setText(String.valueOf("+"));
            }
        });
        
        btnAdd.setBounds(124, 144, 100, 23);
        frame.getContentPane().add(btnAdd);
        
        JButton btnSub = new JButton("Subtract");
        btnSub.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            textField.setText(String.valueOf("-"));
            
            }
        });
        btnSub.setBounds(267, 144, 89, 23);
        frame.getContentPane().add(btnSub);
        
        JButton btnMul = new JButton("Multiply");
        btnMul.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                    textField.setText(String.valueOf("*"));
            }
        });
        btnMul.setBounds(124, 190, 100, 23);
        frame.getContentPane().add(btnMul);
        
        JButton btnDiv = new JButton("Divide");
        btnDiv.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                textField.setText(String.valueOf("/"));
            }
        });
        btnDiv.setBounds(267, 190, 100, 23);
        frame.getContentPane().add(btnDiv);
        
        JButton btnSolve = new JButton("Solve");
        btnSolve.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

//              String a = textField.getText();
//              int i=Integer.parseInt(a);

            }
        });
        btnSolve.setBounds(202, 227, 100, 23);
        frame.getContentPane().add(btnSolve);
    }
}

我希望有人能帮我解决这个问题。

在这里问这种问题有点危险,因为您得到的答案可能超出您的需求 and/or 理解范围。

我怀疑也许你可以利用 JOptionPane 提示用户输入第一个数字、运算符和最后一个数字,将每个请求的结果分配给一个变量。

你应该先看看 How to Make Dialogs

要将输入限制为数值,您可以使用 How to Use Formatted Text Fields or a DocumentFilter。两者都不简单。或者,您可以使用 Integer.parse(String) 来解析提示用户时返回的文本,并将其放入循环中,直到获得适当的响应。

对于操作员,我只使用 JComboBox 来限制用户输入您想要的内容。参见 How to Use Combo Boxes

现在,在你问之前,不,我不能给你举个例子(事实上我已经在上面列出了一个数字)。练习的重点是让您应用所学内容。

根据改进的要求进行更新

你会后悔你问的。

基本概念是您 运行 处于事件驱动的环境中,也就是说,某事发生后您会做出响应。你有责任管理状态并根据可用信息做事。

至于只接受整数的要求,你可以使用DocumentFilter,但这是相当高级的概念,详情请参阅Implementing a Document Filter。或者,您可以只解析文本并在失败时向用户显示错误消息,这取决于您。

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.border.EmptyBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        enum Operator {
            ADD, SUBTRACT, MULTIPLE, DIVIDE;
        }

        private JTextField inputField;
        private JToggleButton addButton = new JToggleButton("Add");
        private JToggleButton subtractButton = new JToggleButton("Subtract");
        private JToggleButton multipleButton = new JToggleButton("Multiple");
        private JToggleButton divideButton = new JToggleButton("Divide");

        private JButton solveButton = new JButton("Solve");

        private JToggleButton[] operators = new JToggleButton[]{
            addButton, subtractButton, multipleButton, divideButton
        };

        private Integer firstValue;
        private Integer secondValue;
        private Operator operator;

        private ButtonGroup operatorButtonGroup = new ButtonGroup();

        public TestPane() {
            setBorder(new EmptyBorder(32, 32, 32, 32));
            setLayout(new GridBagLayout());

            inputField = new JTextField(10);
            inputField.setHorizontalAlignment(JTextField.TRAILING);
            ((AbstractDocument) inputField.getDocument()).setDocumentFilter(new IntegerDocumentFilter());
            inputField.getDocument().addDocumentListener(new DocumentListener() {
                @Override
                public void insertUpdate(DocumentEvent e) {
                    updateState();
                }

                @Override
                public void removeUpdate(DocumentEvent e) {
                    updateState();
                }

                @Override
                public void changedUpdate(DocumentEvent e) {
                    updateState();
                }
            });

            operatorButtonGroup.add(addButton);
            operatorButtonGroup.add(subtractButton);
            operatorButtonGroup.add(multipleButton);
            operatorButtonGroup.add(divideButton);

            addButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    firstValue = getCurrentValue();
                    if (firstValue != null) {
                        setOperator(Operator.ADD);
                        inputField.setText(null);
                    }
                }
            });

            subtractButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    firstValue = getCurrentValue();
                    if (firstValue != null) {
                        setOperator(Operator.SUBTRACT);
                        inputField.setText(null);
                    }
                }
            });

            multipleButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    firstValue = getCurrentValue();
                    if (firstValue != null) {
                        setOperator(Operator.MULTIPLE);
                        inputField.setText(null);
                    }
                }
            });

            divideButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    firstValue = getCurrentValue();
                    if (firstValue != null) {
                        setOperator(Operator.DIVIDE);
                        inputField.setText(null);
                    }
                }
            });

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.weightx = 1;
            gbc.anchor = GridBagConstraints.LINE_END;
            add(inputField, gbc);

            JPanel operatorPane = new JPanel(new GridLayout(2, 2));
            operatorPane.add(addButton);
            operatorPane.add(subtractButton);
            operatorPane.add(multipleButton);
            operatorPane.add(divideButton);

            gbc.gridy++;
            gbc.weightx = 0;
            gbc.anchor = GridBagConstraints.LINE_END;

            add(operatorPane, gbc);

            gbc.gridy++;
            gbc.weightx = 0;
            gbc.anchor = GridBagConstraints.LINE_END;

            add(solveButton, gbc);

            solveButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    Integer secondValue = getCurrentValue();
                    if (firstValue != null && secondValue != null && operator != null) {
                        // Insert your logic here

                        resetState();
                    } else {
                        JOptionPane.showMessageDialog(TestPane.this, "Can't not solve equation, missing required parameters", "Error", JOptionPane.ERROR_MESSAGE);
                    }
                }
            });

            solveButton.setEnabled(false);
            setOperatorsEnabled(false);
        }

        protected void resetState() {
            firstValue = null;
            operator = null;

            inputField.setText(null);
            operatorButtonGroup.clearSelection();

            updateState();
        }

        protected Integer getCurrentValue() {
            try {
                return Integer.parseInt(inputField.getText());
            } catch (NumberFormatException exp) {
                return null;
            }
        }

        protected void setOperatorsEnabled(boolean enabled) {
            for (JToggleButton btn : operators) {
                btn.setEnabled(enabled);
            }
        }

        protected void updateState() {
            String currentValue = inputField.getText();
            if (currentValue.isBlank()) {
                solveButton.setEnabled(false);
                setOperatorsEnabled(false);
            } else {
                if (operator != null) {
                    solveButton.setEnabled(true);
                    setOperatorsEnabled(false);
                } else {
                    solveButton.setEnabled(false);
                    setOperatorsEnabled(true);
                }
            }
        }

        protected void setOperator(Operator operator) {
            this.operator = operator;
            updateState();
        }

    }

    public class IntegerDocumentFilter extends DocumentFilter {

        public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {
            try {
                int parseInt = Integer.parseInt(text);
                super.insertString(fb, offset, text, attr);
            } catch (NumberFormatException exp) {
                Toolkit.getDefaultToolkit().beep();
            }
        }

        public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String string, AttributeSet attr) throws BadLocationException {
            if (string == null || string.isBlank()) {
                super.replace(fb, offset, length, "", attr);
            } else {
                try {
                    int parseInt = Integer.parseInt(string);
                    super.replace(fb, offset, length, string, attr);
                } catch (NumberFormatException exp) {
                    Toolkit.getDefaultToolkit().beep();
                }
            }
        }
    }
}