본문 바로가기
JAVA

Calculator with Swing

by KWONE 2024. 12. 6.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class EX6 extends JFrame {
    private JTextField tfInput; // 수식 입력 필드
    private JTextField tfOutput; // 결과 출력 필드

    public EX6() {
        super("Calculator");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new BorderLayout());
        c.add(new northPanel(), BorderLayout.NORTH);
        c.add(new centerPanel(), BorderLayout.CENTER);
        c.add(new southPanel(), BorderLayout.SOUTH);

        setSize(400, 400);
        setVisible(true);
        c.setFocusable(true);
        c.requestFocus();
    }

    class northPanel extends JPanel {
        public northPanel() {
            setBackground(Color.GRAY);
            JLabel input = new JLabel("수식");
            tfInput = new JTextField(20); // 필드 초기화
            setLayout(new FlowLayout());
            add(input);
            add(tfInput);
        }
    }

    class centerPanel extends JPanel {
        public centerPanel() {
            String[] buttonOrder = {"C", "UN", "BK", "/", "7", "8", "9", "x", "4", "5", "6", "-", "1", "2", "3", "+", "0", ".", "=", "%"};
            JButton[] buttons = new JButton[buttonOrder.length];
            setLayout(new GridLayout(5, 4));

            for (int i = 0; i < buttonOrder.length; i++) {
                buttons[i] = new JButton(buttonOrder[i]);
                add(buttons[i]);

                // 버튼별 이벤트 처리
                String btnText = buttonOrder[i];
                buttons[i].addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        switch (btnText) {
                            case "C":
                                tfInput.setText(""); // 입력 필드 초기화
                                tfOutput.setText(""); // 결과 필드 초기화
                                break;
                            case "UN":
                                String inputText = tfInput.getText();
                                if (inputText.length() > 0) {
                                    tfInput.setText(inputText.substring(0, inputText.length() - 1));
                                }
                                break;
                            case "BK":
                                // 작동하지 않는 버튼
                                break;
                            case "=":
                                calculateResult(); // 결과 계산
                                break;
                            default:
                                tfInput.setText(tfInput.getText() + btnText); // 버튼 값 추가
                                break;
                        }
                    }
                });
            }
        }
    }

    class southPanel extends JPanel {
        public southPanel() {
            setBackground(Color.YELLOW);
            JLabel output = new JLabel("결과");
            tfOutput = new JTextField(20); // 필드 초기화
            tfOutput.setEditable(false); // 결과 필드는 읽기 전용
            setLayout(new FlowLayout());
            add(output);
            add(tfOutput);
        }
    }

    private void calculateResult() {
        String expression = tfInput.getText().trim();

        try {
            if (expression.contains("/")) {
                String[] parts = expression.split("/");
                double num1 = Double.parseDouble(parts[0]);
                double num2 = Double.parseDouble(parts[1]);
                if (num2 == 0) {
                    tfOutput.setText("0으로 나눌 수 없음");
                } else {
                    tfOutput.setText(String.valueOf(num1 / num2));
                }
            } else if (expression.contains("x")) {
                String[] parts = expression.split("x");
                double num1 = Double.parseDouble(parts[0]);
                double num2 = Double.parseDouble(parts[1]);
                tfOutput.setText(String.valueOf(num1 * num2));
            } else if (expression.contains("+")) {
                String[] parts = expression.split("\\+");
                double num1 = Double.parseDouble(parts[0]);
                double num2 = Double.parseDouble(parts[1]);
                tfOutput.setText(String.valueOf(num1 + num2));
            } else if (expression.contains("-")) {
                String[] parts = expression.split("-");
                double num1 = Double.parseDouble(parts[0]);
                double num2 = Double.parseDouble(parts[1]);
                tfOutput.setText(String.valueOf(num1 - num2));
            } else if (expression.contains("%")) {
                String[] parts = expression.split("%");
                double num1 = Double.parseDouble(parts[0]);
                double num2 = Double.parseDouble(parts[1]);
                tfOutput.setText(String.valueOf(num1 % num2));
            } else {
                tfOutput.setText("잘못된 수식");
            }
        } catch (Exception e) {
            tfOutput.setText("오류: 유효하지 않은 수식");
        }
    }

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

 

'JAVA' 카테고리의 다른 글

Money Changer with CheckBox  (0) 2024.12.06
컬렉션  (1) 2024.09.24
Chapter 05 실습 문제  (0) 2024.08.19
상속 활용 예제  (0) 2024.08.18
Chapter 04 실습 문제  (0) 2024.08.16