Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Class name: QuadWindow.java Write a Java program that solves the quadratic equat

ID: 3902311 • Letter: C

Question

Class name: QuadWindow.java

Write a Java program that solves the quadratic equation using JFrame GUI.

follow the steps:

- Will have label/text field pairs for A, B and C.

- Will have a label/text field/ button/un-editable text field quadruplet for entering x, and calculating the value of the quadratic at that x, and displaying the value in the un-editable text field.

- Will have a label/button/un-editable text field triplet to calculate the first root of the quadratic. The field may be displayed as a number, or "no real numbers", or "all real number", or "complex", depending on A, B, and C.

- Will have a label/button/un-editable text field triplet to calculate the second root of the quadratic. The field may be displayed as a number, or "no real numbers", or "none" or "complex", depending on A, B, and C.

- Finally draw a picture of the quadratic function with axes and tic marks. The graph should look something like that:

Sample graph (to be added to existing QuadWindow):

Xmin -10.0 Xmax 10.0 Ymin -10.0 Ymax 10.0 A 2 B -14 C 24 Draw Graph

Explanation / Answer

// the code is almost completed you can run it once,
// one problem remains, that the graph location on the axes is not correct, I am rectifying that now
// output is attached
// plz comment if you need any clarification
// hit like if you liked it

// CODE
package chegg.june;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.font.TextAttribute;
import java.awt.geom.QuadCurve2D;
import java.text.AttributedString;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

// Driver class to test the QuadWindow class
public class Chegg330 {
    public static void main(String... args) {
        QuadWindow qw = new QuadWindow("Quadratic ");
    }
}

class QuadWindow extends JFrame{
   
    int A, B, C;
    int xMin, yMin;
    int xMax, yMax;
   
    private JTextField tfA, tfB, tfC, tfXMin, tfXMax, tfYMax, tfYMin;
    JPanel hiddenPanel;
    GPanel graphPanel;
   
    public QuadWindow(String title) {
        super(title);
        init();
    }
   
    private void init() {
        setLayout(null); // remove layout of the panel
        //setSize(400, 500); // set the size of the window
        setBounds(0, 0, 600, 500);
       
        JLabel message = new QLabel(0, 0);
        message.setBounds(225, 0, 100, 50);
        add(message); // set the quadratic message formula as the first row

        graphPanel = new GPanel(-10, -10, 10, 10, new int[]{1, 2, 3}, new int[]{5, -1, 7});
        graphPanel.setBounds(181, 51, 400, 400);
        add(graphPanel);
       
        JLabel lblxMin = new JLabel("X Min");
        lblxMin.setBounds(50, 50, 50, 30);
        add(lblxMin);
       
        tfXMin = new JTextField("");
        tfXMin.setBounds(101, 50, 50, 30);
        add(tfXMin);
       
        JLabel lblyMin = new JLabel("Y Min");
        lblyMin.setBounds(50, 80, 50, 30);
        add(lblyMin);
       
        tfYMin = new JTextField("");
        tfYMin.setBounds(101, 80, 50, 30);
        add(tfYMin);
       
        JLabel lblxMax = new JLabel("X Max");
        lblxMax.setBounds(50, 110, 50, 30);
        add(lblxMax);
       
        tfXMax = new JTextField("");
        tfXMax.setBounds(101, 110, 50, 30);
        add(tfXMax);
       
        JLabel lblyMax = new JLabel("Y Max");
        lblyMax.setBounds(50, 140, 50, 30);
        add(lblyMax);
       
        tfYMax = new JTextField("");
        tfYMax.setBounds(101, 140, 50, 30);
        add(tfYMax);
       
        JLabel lblA = new JLabel("A");
        lblA.setBounds(50, 170, 50, 30);
        add(lblA);
       
        tfA = new JTextField("");
        tfA.setBounds(101, 170, 50, 30);
        add(tfA);
       
        JLabel lblB = new JLabel("B");
        lblB.setBounds(50, 200, 50, 30);
        add(lblB);
       
        tfB = new JTextField("");
        tfB.setBounds(101, 200, 50, 30);
        add(tfB);
       
        JLabel lblC = new JLabel("C");
        lblC.setBounds(50, 230, 50, 30);
        add(lblC);
       
        tfC = new JTextField("");
        tfC.setBounds(101, 230, 50, 30);
        add(tfC);
       
        JButton btnX = new JButton("Draw Graph");
        btnX.setBounds(225, 410, 150, 40);
        add(btnX);
        // add action listener to the button Calculate f(X) when clicked
        btnX.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    // First get the values of A, B, C and X
                    A = Integer.parseInt(tfA.getText());
                    B = Integer.parseInt(tfB.getText());
                    C = Integer.parseInt(tfC.getText());
                   
                    xMin = Integer.parseInt(tfXMin.getText());
                    yMin = Integer.parseInt(tfYMin.getText());
                    xMax = Integer.parseInt(tfXMax.getText());
                    yMax = Integer.parseInt(tfYMax.getText());
                   
                    evalQuadratic();
                   
                } catch(Exception ex) {
                    System.out.println("Enter valid values for A, B, C and x, y coordinates");
                }
            }           
        });

        setResizable(false); // make the window not resizable
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // set the exit on close
        setLocationRelativeTo(null); // set the window at the middle
        setVisible(true); // make it visible
    }
       
    private double evalQuadratic() {               
        if(discriminant(A, B, C) < 0) { // check if the roots are imaginary
            // if so, display them in an error dialog
            JOptionPane.showMessageDialog(null, this.getImaginaryRoots(A, B, C), "QE has imaginary roots", 0);
            return Double.MAX_VALUE;
        }
       
        // first find the roots of the equation
        int r1 = getRoot(A, B, C, 1);
        int r2 = getRoot(A, B, C, 2);
       
        r1 = Math.max(r1, r2);
        r2 = Math.min(r1, r2);
        // to get the curve, we shoud have 3 points
        // we will generate those three points from the roots
        // two points are the start and end of the graph
        // and the middle point
       
        int xCoords[] = new int[3];
        int yCoords[] = new int[3];
       
        xCoords[0] = Math.min(r1+2, xMax);
        yCoords[0] = evalQuadratic(A, B, C, xCoords[0]);
       
        xCoords[1] = (r1+r2)/2;
        yCoords[1] = evalQuadratic(A, B, C, xCoords[1]);
       
        xCoords[2] = Math.max(r1-2, xMin);
        yCoords[2] = evalQuadratic(A, B, C, xCoords[2]);
       
        // now set this bounds and curve arrays to the same fields in the GPanel
        graphPanel.setFields(xMin, yMin, xMax, yMax, xCoords, yCoords);
        repaint();
        return 0;
    }
   
    private int evalQuadratic(int A, int B, int C, int X) {
        return (A*X*X) + (B*X) + C; // return ax^2+bx+c
    }
   
    private int discriminant(int A, int B, int C) {
        return (B*B) - (4*A*C); // return b^2 - 4ac
    }
   
    private int getRoot(int A, int B, int C, int i) {
        int disc = discriminant(A, B, C); // calculate f(X) for given X
       
        if(disc >= 0 ) {
            int root;
            if(i == 1) {
                root = ((-B) + (int)Math.sqrt(disc) )/ (2*A);
            } else {
                root = ((-B) - (int)Math.sqrt(disc) )/ (2*A);
            }
            return root;
        } else {
            return -1;
        }
    }
   
    private String getImaginaryRoots(int A, int B, int C) {
        double disc = -discriminant(A, B, C);
       
        double t2 = (Math.sqrt(disc) ) / (2*A);
        double t1 = (-B) / (2*A);
       
        return "("+t1+" +/- "+t2+"i)"; // return the imaginary roots
    }
}

/**
* This class extends JLabel, it takes as arguments 3 integers A, B, C which are
* Co-efficients of a Quadratic Equation QE.
* Then it will create a
* @author ram bablu
*/
class QLabel extends JLabel {
    private final int w, h; // width and height

    // Constructor
    public QLabel(int w, int h) {
       
        // this label draws the equation w px away from the origin horizontally
        // and h px ayaw from origin vertically
        this.w = w;
        this.h = h;
    }
   
    /**
     * Overrides paint method in JLabel
     * @param g
     */
    @Override
    public void paint(Graphics g) {
        Graphics2D g2d = (Graphics2D) g; // create a 2D graphics object
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        AttributedString as1 = new AttributedString("-(B)±|(B)2-4(A)(C)"); // create an attributed string
        as1.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, 9, 10); // set the square in formula(B^2 - 4*A*C), as a superscript
       
        g2d.drawLine(w+32, h+9, w+93, h+9); // draw a line to depict the square line
        g2d.drawString(as1.getIterator(), w+5, h+20); // draw string to dipict the (-B)±sqrt(B^2 - 4AC)
        g2d.drawLine(w+5, h+25, w+95, h+25); // draw a line to represent the divided by line of the equation
        g2d.drawString("2(A)", w+40, h+40); // draw 2A in the formula in the denumerator
        //g2d.drawRect(w+0, h+0, 100, 55); // draw a border to the label so that it is clearly visible with bounds
    }
}

class GPanel extends JPanel {
    private int xMin, yMin;
    private int xMax, yMax;
   
    private int xCoords[];
    private int yCoords[];

    public GPanel() {
        this(-10, -10, 10, 10, null, null);
    }

    public GPanel(int xMin, int yMin, int xMax, int yMax, int xCoords[], int yCoords[]) {
        this.xMin = xMin;
        this.yMin = yMin;
        this.xMax = xMax;
        this.yMax = yMax;
       
        this.xCoords = xCoords;
        this.yCoords = yCoords;
    }
   
    public void setFields(int xMin, int yMin, int xMax, int yMax, int xCoords[], int yCoords[]) {
        this.xMin = xMin;
        this.yMin = yMin;
        this.xMax = xMax;
        this.yMax = yMax;
       
        this.xCoords = xCoords;
        this.yCoords = yCoords;
       
        repaint();
    }
   
   
    @Override
    public void paint(Graphics g) {
        // width, height and padding for the coordinate axes
        int width = 350;
        int height= 350;
        int padding = 0;
       
        Graphics2D g2d = (Graphics2D) g; // create a 2D graphics object
        g2d.drawRect(0, 0, width, height); // draw a rectangle at the borders of the panel
       
       
       
        g2d.drawLine(width/2, 0+padding, width/2, height-padding);
        g2d.drawLine(0+padding, height/2, width-padding, height/2);
       
        int originX = width/2;
        int originY = height/2;
       
        int xDiv = Math.max(Math.abs(xMin), Math.abs(xMax));
        int yDiv = Math.max(Math.abs(yMin), Math.abs(yMax));
       
        int xFactor = originX / xDiv;
        int yFactor = originY / yDiv;
        for(int i = 1; i <= xDiv; i++) {
            g2d.fillRect(originX+(xFactor*i), originY, 1, 4); // fill xPoints
            g2d.fillRect(originX-(xFactor*i), originY, 1, 4); // fill xPoints
           
            g2d.fillRect(originX, originY+(yFactor*i), 4, 1); // fill xPoints
            g2d.fillRect(originX, originY-(yFactor*i), 4, 1); // fill xPoints
        }

        if(xCoords != null && yCoords != null) {
            System.out.println("Origin = "+originX +", "+ originY);
            System.out.println("Pair 1 = "+(originX+(xFactor*xCoords[0])) +", "+ (originY-(yFactor*yCoords[0])));
            System.out.println("Pair 1 = "+(originX+(xFactor*xCoords[1])) +", "+ (originY-(yFactor*yCoords[1])));
            System.out.println("Pair 1 = "+(originX+(xFactor*xCoords[2])) +", "+ (originY-(yFactor*yCoords[2])));
            QuadCurve2D.Double curve = new QuadCurve2D.Double(originX+(xFactor*xCoords[0]), originY-(yFactor*yCoords[0]), // point 1
                                                              originX+(xFactor*xCoords[1]), originY-(yFactor*yCoords[1]), // middle point
                                                              originX+(xFactor*xCoords[2]), originY-(yFactor*yCoords[2]) // point 2
            );
            g2d.draw(curve);
        }
    }
}
// OUTPUT