Calculator (JAVA)

อธิบายโค้ดแบบเข้าใจง่าย

ภาพรวมของโปรแกรม

โค้ดนี้เป็นการสร้างแอปพลิเคชันเครื่องคิดเลขด้วยภาษา Java โดยใช้ Swing Library สำหรับสร้างส่วนติดต่อผู้ใช้ (GUI) มีฟังก์ชันการคำนวณพื้นฐานเช่น บวก, ลบ, คูณ, หาร รวมถึงฟังก์ชันคณิตศาสตร์ขั้นสูงอย่าง เปอร์เซ็นต์, ยกกำลัง, รากที่สอง และฟังก์ชันตรีโกณมิติ (sin, cos, tan)

โครงสร้างของคลาส Calculator

คลาส Calculator สืบทอดจาก JFrame และ implements ActionListener เพื่อจัดการเหตุการณ์การคลิกปุ่มต่างๆ

ตัวแปรหลักที่ใช้

// ส่วนแสดงผล
private JTextField textField;         // ช่องแสดงผลลัพธ์
private JLabel operationLabel;        // แสดงขั้นตอนหรือสัญลักษณ์การคำนวณ

// ปุ่มกดต่างๆ
private JButton[] numberButtons = new JButton[10];   // ปุ่มตัวเลข 0-9
private JButton addBtn, subBtn, mulBtn, divBtn;      // ปุ่มเครื่องหมาย +, -, ×, ÷
private JButton decBtn, equBtn, clrBtn, percentBtn, powBtn, sqrtBtn;  // ปุ่มฟังก์ชันอื่นๆ
private JButton sinBtn, cosBtn, tanBtn;              // ปุ่มฟังก์ชันตรีโกณมิติ

// ตัวแปรใช้คำนวณ
private double num1 = 0, num2 = 0, result = 0;     // เก็บตัวเลขและผลลัพธ์
private char operator;                            // เก็บเครื่องหมายการคำนวณ
การออกแบบ UI สวยงาม

ใช้การออกแบบที่ทันสมัยด้วยสี่เหลี่ยมมุมโค้ง, สีที่กำหนดเอง และการจัดเรียงองค์ประกอบที่ดี ทำให้ UI ดูสวยงาม

Custom Rendering

ใช้การ override paintComponent เพื่อวาดองค์ประกอบด้วยตัวเอง ทำให้สามารถปรับแต่งลักษณะได้อย่างอิสระ

ฟังก์ชันคณิตศาสตร์ขั้นสูง

รองรับการคำนวณทั้งพื้นฐานและขั้นสูง เช่น ตรีโกณมิติ รากที่สอง และยกกำลัง

การจัดการ Event

ใช้ ActionListener ในการตอบสนองต่อการกดปุ่ม ทำให้ GUI มีความเป็น Interactive

การสร้างหน้าต่างแอพพลิเคชั่น

โค้ดใช้ JFrame เป็นหน้าต่างหลักและมีการตั้งค่าต่างๆ ในคอนสตรัคเตอร์

setupFrame()

เมธอดนี้ตั้งค่าเริ่มต้นของหน้าต่าง เช่น ขนาด, ชื่อ, และการปิดโปรแกรม

private void setupFrame() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  // ปิดโปรแกรมเมื่อปิดหน้าต่าง
    setSize(400, 600);                             // ขนาด 400x600 พิกเซล
    setTitle("Calculator");                        // ชื่อหน้าต่าง
    
    // สร้าง mainPanel ด้วยพื้นหลังแบบมุมโค้ง
    mainPanel = new JPanel() {
        @Override
        protected void paintComponent(Graphics g) {
            // โค้ดสำหรับวาดพื้นหลังสี่เหลี่ยมมุมโค้ง
        }
    };
}

การสร้างและจัดวางองค์ประกอบ UI

setupTextField()

จัดเตรียมช่องแสดงผลลัพธ์และป้ายแสดงขั้นตอนการคำนวณ

private void setupTextField() {
    operationLabel = new JLabel("", SwingConstants.RIGHT);  // สร้างและตั้งค่า Label
    textField = new JTextField("0");                       // สร้างช่องแสดงผล
    
    // สร้าง Panel เพื่อรวม operationLabel และ textField
    JPanel textPanel = new JPanel(new BorderLayout()) {
        @Override
        protected void paintComponent(Graphics g) {
            // โค้ดสำหรับวาดพื้นหลัง
        }
    };
}
setupButtons()

สร้างและจัดวางปุ่มต่างๆ ด้วย GridBagLayout

private void setupButtons() {
    buttonPanel = new JPanel(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints();
    
    // สร้างปุ่มต่างๆ
    clrBtn = createButton("C", OPERATOR_BTN_COLOR);
    // สร้างปุ่มอื่นๆ...
    
    // จัดวางปุ่มใน GridBagLayout
    gbc.gridx = 0; gbc.gridy = 0; buttonPanel.add(clrBtn, gbc);
    // จัดวางปุ่มอื่นๆ...
}
createButton()

เมธอดสำหรับสร้างปุ่มแบบกำหนดเองด้วยสไตล์ที่สวยงาม

private JButton createButton(String text, Color bgColor) {
    JButton button = new JButton(text) {
        @Override
        protected void paintComponent(Graphics g) {
            // โค้ดสำหรับวาดปุ่มสวยๆ ด้วยสี่เหลี่ยมมุมโค้ง
        }
    };
    
    button.addActionListener(this);  // เพิ่ม listener สำหรับรองรับการคลิก
    return button;
}

การจัดการเหตุการณ์และการคำนวณ

actionPerformed()

เมธอดที่ถูกเรียกเมื่อมีการคลิกปุ่ม จัดการเหตุการณ์ต่างๆ ของปุ่มทั้งหมด

@Override
public void actionPerformed(ActionEvent e) {
    // ตรวจสอบการกดปุ่มตัวเลข
    for (int i = 0; i < 10; i++) {
        if (e.getSource() == numberButtons[i]) {
            // โค้ดจัดการการกดปุ่มตัวเลข
            return;
        }
    }
    
    // ตรวจสอบการกดปุ่มอื่นๆ
    if (e.getSource() == decBtn) {
        // โค้ดจัดการการกดปุ่มจุดทศนิยม
    } else if (e.getSource() == addBtn) {
        performOperation('+');
    }
    // จัดการปุ่มอื่นๆ...
}

เมธอดสำหรับการคำนวณ

performOperation()

จัดการการกดปุ่มเครื่องหมายคณิตศาสตร์ (+, -, ×, ÷, ^)

calculateResult()

คำนวณผลลัพธ์เมื่อกดปุ่ม = ตามเครื่องหมายที่เลือกไว้

calculateSquareRoot()

คำนวณรากที่สองของตัวเลขที่ป้อนเข้ามา

calculateTrigonometricFunction()

คำนวณฟังก์ชันตรีโกณมิติ (sin, cos, tan)

calculatePercent()

คำนวณเปอร์เซ็นต์ของตัวเลขที่ป้อนเข้ามา

เอฟเฟกต์พิเศษและความสวยงามของ UI

โค้ดนี้มีความพิเศษตรงที่มีการใช้เทคนิคการวาดกราฟิกด้วย Java 2D เพื่อสร้าง UI ที่สวยงาม:

การเพิ่ม Hover Effect

private void addHoverEffects() {
    Component[] components = buttonPanel.getComponents();
    for (Component component : components) {
        if (component instanceof JButton) {
            JButton button = (JButton) component;
            button.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseEntered(MouseEvent e) {
                    button.setCursor(new Cursor(Cursor.HAND_CURSOR));
                }
            });
        }
    }
}

การเริ่มต้นโปรแกรม

เมธอด main จะเริ่มต้นโปรแกรมโดยการสร้างอินสแตนซ์ของคลาส Calculator

public static void main(String[] args) {
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (Exception e) {
        e.printStackTrace();
    }
    new Calculator();  // สร้างอินสแตนซ์เพื่อเริ่มต้นโปรแกรม
}

สรุปการทำงานของโปรแกรม

  1. สร้างหน้าต่างหลักและตั้งค่าต่างๆ
  2. สร้างช่องแสดงผลและป้ายแสดงขั้นตอนการคำนวณ
  3. สร้างและจัดวางปุ่มต่างๆ ในแผงควบคุม
  4. เพิ่ม ActionListener ให้กับปุ่มเพื่อรองรับการคลิก
  5. เมื่อมีการคลิกปุ่ม จะเรียกใช้เมธอดที่เหมาะสมสำหรับการคำนวณ
  6. แสดงผลลัพธ์ในช่องแสดงผล

โค้ดนี้เป็นตัวอย่างของการใช้ Java Swing สร้าง GUI ที่สวยงามและมีประสิทธิภาพ โดยไม่ต้องใช้ไลบรารีภายนอกเพิ่มเติม