28/09/2018, 22:16

Giải phương trình bậc 2 trong Java Swing

Swing trong Java – Giới thiệu Java Swing Đề bài Viết chương trình giải phương trình bậc 2 trong java sử dụng Swing. Phương trình bậc 2 có dạng: Lời giải Thay vì sử dụng java.util.Scanner như trong bài giải phương trình bậc 2 trong java, bài này chúng ta sẽ sử dụng ...

Swing trong Java – Giới thiệu Java Swing

Đề bài

Viết chương trình giải phương trình bậc 2 trong java sử dụng Swing. Phương trình bậc 2 có dạng:

giải phương trình bậc 2 trong java swing

Lời giải

Thay vì sử dụng java.util.Scanner như trong bài giải phương trình bậc 2 trong java, bài này chúng ta sẽ sử dụng Swing để tạo giao diện window như sau:

giải phương trình bậc 2 trong java swing

Bài này được viết trên eclipse, bạn có thể tham khảo bài tạo chương trình java đầu tiên trên eclipse.

Tạo 3 lớp như sau:

  • PTB2View.java: lớp này extends lớp JFrame được sử dụng để tạo giao diện window.
  • PTB2Controller.java: lớp nãy implements interface ActionListener, được sử dụng để lắng nghe sự kiện khi người dùng click button “Kết Quả” trên window, xác thực các hạng mục nhập và tính nghiệm của phương trình bậc 2.
  • PTB2.java: lớp này chứa hàm main() để khởi chạy chương trình.

Lớp PTB2View.java

package vn.viettuts.swing.ptb2;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class PTB2View extends JFrame {
    private JTextField textFieldA;
    private JTextField textFieldB;
    private JTextField textFieldC;
    private JButton btnKetQua;
    private JTextArea textArea;

    public PTB2View() {
        setTitle("Java Swing - giải phương trình bậc 2");
        // tạo các label hằng số
        JLabel labelHangSo = new JLabel("Hằng số:");
        JLabel labelHangSoA = new JLabel("a:");
        JLabel labelHangSoB = new JLabel("b:");
        JLabel labelHangSoC = new JLabel("c:");
        labelHangSo.setBounds(20, 20, 50, 20);
        labelHangSoA.setBounds(20, 50, 30, 20);
        labelHangSoB.setBounds(100, 50, 30, 20);
        labelHangSoC.setBounds(180, 50, 30, 20);
        // tạo các trường nhập hằng số
        textFieldA = new JTextField();
        textFieldB = new JTextField();
        textFieldC = new JTextField();
        textFieldA.setBounds(40, 50, 40, 20);
        textFieldB.setBounds(120, 50, 40, 20);
        textFieldC.setBounds(200, 50, 40, 20);
        // tạo button để tính nghiệm của phương trình bậc 2
        btnKetQua = new JButton("Kết Quả");
        btnKetQua.setBounds(20, 80, 80, 30);
        // tạo textarea để hiện thị kết quả
        textArea = new JTextArea();
        textArea.setBounds(20, 120, 350, 150);
        // add các đối tượng vào jframe
        add(labelHangSo);
        add(labelHangSoA);
        add(textFieldA);
        add(labelHangSoB);
        add(textFieldB);
        add(labelHangSoC);
        add(textFieldC);
        add(btnKetQua);
        add(textArea);
        // thiết lập bố cục (layout)
        setLayout(null);
        // thiết lập kích thước jframe
        setSize(450, 400);
        // hiển thị jframe
        setVisible(true);
    }

    public JTextField getTextFieldA() {
        return textFieldA;
    }

    public void setTextFieldA(JTextField textFieldA) {
        this.textFieldA = textFieldA;
    }

    public JTextField getTextFieldB() {
        return textFieldB;
    }

    public void setTextFieldB(JTextField textFieldB) {
        this.textFieldB = textFieldB;
    }

    public JTextField getTextFieldC() {
        return textFieldC;
    }

    public void setTextFieldC(JTextField textFieldC) {
        this.textFieldC = textFieldC;
    }

    public JButton getBtnKetQua() {
        return btnKetQua;
    }

    public void setBtnKetQua(JButton btnKetQua) {
        this.btnKetQua = btnKetQua;
    }

    public JTextArea getTextArea() {
        return textArea;
    }

    public void setTextArea(JTextArea textArea) {
        this.textArea = textArea;
    }
}

Lớp PTB2Controller.java

package vn.viettuts.swing.ptb2;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JOptionPane;

public class PTB2Controller implements ActionListener {
    private PTB2View view;
    private float hangsoA;
    private float hangsoB;
    private float hangsoC;

    public PTB2Controller(PTB2View view) {
        this.view = view;
        view.getBtnKetQua().addActionListener(this);
        view.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(1);
            }
        });
    }

    /**
     * Giải phương trình bậc 2: ax2 + bx + c = 0
     * 
     * @param a: hệ số bậc 2
     * @param b: hệ số bậc 1
     * @param c: số hạng tự do
     */
    private static String giaiPTBac2(float a, float b, float c) {
        String ketqua = null;
        
        // kiểm tra các hệ số
        if (a == 0) {
            if (b == 0) {
                ketqua = "Phương trình vô nghiệm!";
            } else {
                ketqua = "Phương trình có một nghiệm: " + "x = " + (-c / b);
            }
        }
        // tính delta
        float delta = b*b - 4*a*c;
        float x1;
        float x2;
        // tính nghiệm
        if (delta > 0) {
            x1 = (float) ((-b + Math.sqrt(delta)) / (2*a));
            x2 = (float) ((-b - Math.sqrt(delta)) / (2*a));
            ketqua = "Phương trình có 2 nghiệm là: " + "x1 = " + x1 
                    + " và x2 = " + x2;
        } else if (delta == 0) {
            x1 = (-b / (2 * a));
            ketqua = "Phương trình có nghiệm kép: " + "x1 = x2 = " + x1;
        } else {
            ketqua = "Phương trình vô nghiệm!";
        }
        
        return ketqua;
    }

    private boolean validateHangSoA() {
        boolean isValid = false;
        try {
            if (!"".equals(view.getTextFieldA().getText())) {
                hangsoA = Float.parseFloat(view.getTextFieldA().getText());
                isValid = true;
            } else {
                JOptionPane.showMessageDialog(view, "Hằng số a không được trống.");
            }
        } catch (NumberFormatException ex) {
             ex.printStackTrace();
            JOptionPane.showMessageDialog(view, "Hằng số a không hợp lệ.");
        }
        return isValid;
    }
    
    private boolean validateHangSoB() {
        boolean isValid = false;
        try {
            if (!"".equals(view.getTextFieldB().getText())) {
                hangsoB = Float.parseFloat(view.getTextFieldB().getText());
                isValid = true;
            } else {
                JOptionPane.showMessageDialog(view, "Hằng số b không được trống.");
            }
        } catch (NumberFormatException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(view, "Hằng số b không hợp lệ.");
        }
        return isValid;
    }
    
    private boolean validateHangSoC() {
        boolean isValid = false;
        try {
            if (!"".equals(view.getTextFieldC().getText())) {
                hangsoC = Float.parseFloat(view.getTextFieldC().getText());
                isValid = true;
            } else {
                JOptionPane.showMessageDialog(view, "Hằng số c không được trống.");
            }
        } catch (NumberFormatException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(view, "Hằng số c không hợp lệ.");
        }
        return isValid;
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        if (validateHangSoA() && validateHangSoB() && validateHangSoC()) {
            view.getTextArea().setText(giaiPTBac2(hangsoA, hangsoB, hangsoC));
        } else {
            view.getTextArea().setText("");
        }
    }

    public PTB2View getView() {
        return view;
    }

    public void setView(PTB2View view) {
        this.view = view;
    }
}

Lớp PTB2.java

package vn.viettuts.swing.ptb2;

public class PTB2 {
    public static void main(String[] args) {
        PTB2View view = new PTB2View();
        PTB2Controller controller = new PTB2Controller(view);
    }
}

Kết quả:

Hiển thị ban đầu:

giải phương trình bậc 2 trong java swing

Nhập giá trị đúng cho các hằng số:

giải phương trình bậc 2 trong java swing

Nhập hằng số a không hợp lệ.

giải phương trình bậc 2 trong java swing

Không nhập hằng số a.

giải phương trình bậc 2 trong java swing
Swing trong Java – Giới thiệu Java Swing
0