Đề 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 để tạo giao diện window như sau:
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:
Nhập giá trị đúng cho các hằng số:
Nhập hằng số a không hợp lệ.
Không nhập hằng số a.