You are on page 1of 8

/******************************************************************************

* GUIDriver Class calls the GUI and drives the application


* @author Marcus
* @version 3.5.2016
*****************************************************************************/
public class GUIDriver {
public static void main(String[] args) {
new GUI();
}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import java.util.Stack;
/******************************************************************************
* GUI Class creates the GUI for the Math Tutor App and allows for a user to
* enter their answers and be shown the history of if they got the answer right
* or not
* @author Marcus
* @version 3.5.2016
******************************************************************************/
public class GUI extends JFrame {
private static final int FRAME_WIDTH = 800;
private static final int FRAME_HEIGHT = 450;
private JPanel panel;
private JLabel problemLabel, directionLabel;
private JLabel conclusionLabel;
private JButton calculateButton, answerButton;
private JRadioButton easyButton, moderateButton, hardButton;
private JRadioButton addButton, subButton, mulButton, divButton;
private JTextArea textArea;
private JTextField userAnswer;
private ActionListener listener;
private int number1, number2;
private int result;
private Stack<String> sHist = new Stack<String>();
/*
* Constructor for GUI
*/
public GUI() {
/***** PREPARE FRAME *****/
createControlPanel();
setTitle("Math Tutor");
setSize(FRAME_WIDTH, FRAME_HEIGHT);
setVisible(true);
/***** SHARED LISTENER *****/
listener = new ChoiceListener();
}
/*
* Creates the panel for the frame
*/
public void createControlPanel() {
/***** CREATES THE TOP PANEL *****/
JPanel difficultyPanel = createDifficultyButtons();
JPanel operationPanel = createOperationButtons();
JPanel calculatePanel = createCalculateButton();
JPanel problemPanel = showProblem();

/***** GROUP TOP PANEL *****/


JPanel radioPanel = new JPanel(new GridLayout(4,1));
radioPanel.add(difficultyPanel);
radioPanel.add(operationPanel);
radioPanel.add(calculatePanel);
radioPanel.add(problemPanel);
/***** CREATES BOTTOM PANEL *****/
JPanel userPanel = showAnswer();
JPanel answerPanel = createAnswerButton();
JPanel conclusionPanel = showConclusion();
/***** GROUP BOTTOM PANEL *****/
JPanel entryPanel = new JPanel(new GridLayout(3,1));
entryPanel.setBorder(new EtchedBorder());
entryPanel.add(userPanel);
entryPanel.add(answerPanel);
entryPanel.add(conclusionPanel);
/***** CREATES SIDE PANEL *****/
JPanel historyPanel = createTextArea();
/***** GROUP ALL PANELS *****/
panel = new JPanel(new GridBagLayout());
GridBagConstraints grid = new GridBagConstraints();
grid.fill = GridBagConstraints.HORIZONTAL;
// COLUMN ONE
grid.gridx = 0;
grid.gridy = 0;
panel.add(radioPanel, grid);
grid.gridx = 0;
grid.gridy = 1;
panel.add(entryPanel, grid);
// COLUMN TWO
grid.gridheight = 2;
grid.gridx = 2;
grid.gridy = 0;
panel.add(historyPanel, grid);
/***** ADD PANEL TO FRAME *****/
add(panel);
}
/*
* Create radio buttons for choosing difficulty
* @return panel
*/
public JPanel createDifficultyButtons() {
/***** DIFFICULTY BUTTON OPTIONS *****/
easyButton = new JRadioButton("Easy", true);
moderateButton = new JRadioButton("Moderate");
hardButton = new JRadioButton("Hard");
/***** ADD LISTENER *****/
easyButton.addActionListener(listener);
moderateButton.addActionListener(listener);
hardButton.addActionListener(listener);
/***** GROUP DIFFICULTY BUTTONS *****/
ButtonGroup difficultyGroup = new ButtonGroup();
difficultyGroup.add(easyButton);
difficultyGroup.add(moderateButton);
difficultyGroup.add(hardButton);
/***** CREATE PANEL *****/
JPanel panel = new JPanel(new FlowLayout());
panel.setBorder(new TitledBorder(new EtchedBorder(), "Difficulty"));
panel.add(easyButton);
panel.add(moderateButton);

panel.add(hardButton);
return panel;
}
/*
* Create radio buttons for choosing the operation
* @return panel
*/
public JPanel createOperationButtons() {
/***** OPERATION BUTTON OPTIONS *****/
addButton = new JRadioButton("Addition", true);
subButton = new JRadioButton("Subtraction");
mulButton = new JRadioButton("Multiplication");
divButton = new JRadioButton("Division");
/***** ADD LISTENER *****/
addButton.addActionListener(listener);
subButton.addActionListener(listener);
mulButton.addActionListener(listener);
divButton.addActionListener(listener);
/***** GROUP OPERATIOIN BUTTONS *****/
ButtonGroup operationGroup = new ButtonGroup();
operationGroup.add(addButton);
operationGroup.add(subButton);
operationGroup.add(mulButton);
operationGroup.add(divButton);
/***** CREATE PANEL *****/
JPanel panel = new JPanel(new FlowLayout());
panel.setBorder(new TitledBorder(new EtchedBorder(), "Operation"));
panel.add(addButton);
panel.add(subButton);
panel.add(mulButton);
panel.add(divButton);
return panel;
}
/*
* Creates a button to calculate a random problem
* @return panel
*/
public JPanel createCalculateButton() {
/***** CREATE CALCULATE BUTTON *****/
calculateButton = new JButton("Calculate");
calculateButton.setPreferredSize(new Dimension(410,30));
/***** ADD LISTENER *****/
calculateButton.addActionListener(new ChoiceListener());
/***** CREATE PANEL *****/
JPanel panel = new JPanel();
panel.add(calculateButton);
return panel;
}
/*
* Creates a button to check if answer is correct
* @return panel
*/
public JPanel createAnswerButton() {
/***** CREATE ANSWER BUTTON *****/
answerButton = new JButton("Check Answer");
answerButton.setPreferredSize(new Dimension(410, 30));
/***** ADD LISTENER *****/
answerButton.addActionListener(new ChoiceListener());
/***** CREATE PANEL *****/
JPanel panel = new JPanel();

panel.add(answerButton);
return panel;
}
/*
* Creates the text area to show the history
* @return panel
*/
public JPanel createTextArea() {
/***** HISTORY DISPLAYED IN TEXTAREA *****/
textArea = new JTextArea(22,20);
textArea.setText("User History:\n");
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
textArea.setEditable(false);
/***** CREATE SCROLL BAR *****/
JScrollPane scroll = new JScrollPane(textArea, JScrollPane.VERTICAL_SCRO
LLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
/***** CREATE PANEL *****/
JPanel panel = new JPanel();
panel.add(scroll);
return panel;
}
/*
* Shows the problem in large font
* @return panel
*/
public JPanel showProblem() {
/***** CREATE PROBLEM LABEL *****/
problemLabel = new JLabel("Problem Display");
problemLabel.setFont(new Font("Serif", Font.PLAIN, 30));
/***** CREATE PANEL *****/
JPanel panel = new JPanel();
panel.add(problemLabel);
return panel;
}
/*
* Shows the user's answer in a textfield
* @return panel
*/
public JPanel showAnswer() {
/***** CREATE PROBLEM LABEL *****/
directionLabel = new JLabel("Answer Here");
/***** CREATE USER TEXTFIELD *****/
userAnswer = new JTextField(25);
/***** CREATE PANEL *****/
JPanel panel = new JPanel();
panel.add(directionLabel);
panel.add(userAnswer);
return panel;
}
/*
* Shows if the user got the correct answer or not
* @return panel
*/
public JPanel showConclusion() {
/***** CREATE CONCLUSION LABEL *****/
conclusionLabel = new JLabel("");
conclusionLabel.setFont(new Font("Serif", Font.PLAIN, 30));
/***** CREATE PANEL *****/
JPanel panel = new JPanel();

panel.add(conclusionLabel);
return panel;
}
/*
* Shared listener for the buttons and stores the data in a stack
*/
class ChoiceListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
if(event.getSource() == calculateButton) {
setProblem();
}
if(event.getSource() == answerButton) {
getAnswer();
sHist.add(problemLabel.getText());
sHist.add(userAnswer.getText());
sHist.add(conclusionLabel.getText());
for(String s : sHist) {
textArea.append(s.toString() + "\n");
}
}
}
}
/*
* Generates the problem by calling two random numbers and figuring
* out the math
*/
public void setProblem() {
if(easyButton.isSelected()) {
if(addButton.isSelected()) {
GenerateNumber num = new GenerateNumber(1,50);
number1 = num.getNumber1();
number2 = num.getNumber2();
result = num.additionNumber();
problemLabel.setText(number1 + " + " + number2 + " = ");
}
if(subButton.isSelected()) {
GenerateNumber num = new GenerateNumber(1,50);
number1 = num.getNumber1();
number2 = num.getNumber2();
result = num.subtractionNumber();
problemLabel.setText(number1 + " - " + number2 + " = ");
}
if(mulButton.isSelected()) {
GenerateNumber num = new GenerateNumber(1,12);
number1 = num.getNumber1();
number2 = num.getNumber2();
result = num.multiplicationNumber();
problemLabel.setText(number1 + " * " + number2 + " = ");
}
if(divButton.isSelected()) {
GenerateNumber num = new GenerateNumber(1,12);
number1 = num.getNumber1();
number2 = num.getNumber2();
result = num.divisionNumber();
problemLabel.setText(number1 + " / " + number2 + " = ");
}
} else if(moderateButton.isSelected()) {
if(addButton.isSelected()) {
GenerateNumber num = new GenerateNumber(10,100);
number1 = num.getNumber1();

number2 = num.getNumber2();
result = num.additionNumber();
problemLabel.setText(number1 + " + " + number2 + " = ");
}
if(subButton.isSelected()) {
GenerateNumber num = new GenerateNumber(10,100);
number1 = num.getNumber1();
number2 = num.getNumber2();
result = num.subtractionNumber();
problemLabel.setText(number1 + " - " + number2 + "
}
if(mulButton.isSelected()) {
GenerateNumber num = new GenerateNumber(10,50);
number1 = num.getNumber1();
number2 = num.getNumber2();
result = num.multiplicationNumber();
problemLabel.setText(number1 + " * " + number2 + "
}
if(divButton.isSelected()) {
GenerateNumber num = new GenerateNumber(10,50);
number1 = num.getNumber1();
number2 = num.getNumber2();
result = num.divisionNumber();
problemLabel.setText(number1 + " / " + number2 + "
}
} else {
if(addButton.isSelected()) {
GenerateNumber num = new GenerateNumber(100,1000);
number1 = num.getNumber1();
number2 = num.getNumber2();
result = num.additionNumber();
problemLabel.setText(number1 + " + " + number2 + "
}
if(subButton.isSelected()) {
GenerateNumber num = new GenerateNumber(100,1000);
number1 = num.getNumber1();
number2 = num.getNumber2();
result = num.subtractionNumber();
problemLabel.setText(number1 + " - " + number2 + "
}
if(mulButton.isSelected()) {
GenerateNumber num = new GenerateNumber(10,100);
number1 = num.getNumber1();
number2 = num.getNumber2();
result = num.multiplicationNumber();
problemLabel.setText(number1 + " * " + number2 + "
}
if(divButton.isSelected()) {
GenerateNumber num = new GenerateNumber(10,100);
number1 = num.getNumber1();
number2 = num.getNumber2();
result = num.divisionNumber();
problemLabel.setText(number1 + " / " + number2 + "
}
}
problemLabel.setFont(new Font("Serif", Font.PLAIN, 30));
problemLabel.repaint();

= ");

= ");

= ");

= ");

= ");

= ");

= ");

}
/*
* If user's answer matches correct answer then it will display it or it

* will say that answer is wrong


*/
public void getAnswer() {
String userStringAnswer = userAnswer.getText();
int userIntAnswer = Integer.parseInt(userStringAnswer);
if(result == userIntAnswer) {
conclusionLabel.setText("Correct!");
conclusionLabel.setForeground(Color.green);
} else if(result != userIntAnswer) {
conclusionLabel.setText("Wrong");
conclusionLabel.setForeground(Color.red);
} else {
conclusionLabel.setText("Please enter a valid answer");
}
conclusionLabel.setFont(new Font("Serif", Font.PLAIN, 30));
conclusionLabel.repaint();
}
}
/******************************************************************************
* GenerateNumber Class does all of the arithmetic for the GUI and generates the
* random numbers
* @author Marcus
* @version 3.5.2016
******************************************************************************/
public class GenerateNumber {
private int smallerNum;
private int largerNum;
private int number1;
private int number2;
/*
* Constructor takes in two values
* @param min - smallest range of the difficulty level
* @param max - highest range of the difficulty level
*/
public GenerateNumber(int min, int max) {
smallerNum = min;
largerNum = max;
number1 = getRandomNumber();
number2 = getRandomNumber();
}
/*
* Adds the numbers together
* @return number
*/
public int additionNumber() {
return number1 + number2;
}
/*
* Subtracts the numbers together
* @return number
*/
public int subtractionNumber() {
return number2 - number1;
}
/*
* Multiplies the numbers together
* @return number
*/

public int multiplicationNumber() {


return number2 * number1;
}
/*
* Divides the numbers together
* @return number
*/
public int divisionNumber() {
return number1 / number2;
}
/*
* Generates a random number
* @return random number
*/
public int getRandomNumber() {
return ((int) (Math.random()*(largerNum - smallerNum))) + smallerNum;
}
/*
* Return the first number
*/
public int getNumber1() {
number1 = getRandomNumber();
return number1;
}
/*
* Return the second number
*/
public int getNumber2() {
number2 = getRandomNumber();
return number2;
}
}

You might also like