-
Notifications
You must be signed in to change notification settings - Fork 0
/
MagicEightBallGUI.java
162 lines (127 loc) · 6.06 KB
/
MagicEightBallGUI.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/** MagicEightBallGUI class
* This class will create the actual GUI of the program
* it will also register the controllers, and answer questions
* by changing the text of the JLabel or the output
* Date Created: 11/04/2020
* Created by: P. Anmol
*/
import javax.swing.*;
import java.lang.Math;
import java.awt.*;
public class MagicEightBallGUI extends JComponent
{
//Instance Variables
private MagicEightBallModel game; //The game Model
public JTextField question = new JTextField(10); //The text field where the user will input an answer
public JLabel questionAnswer = new JLabel(); //The label where the anwer to the question will be outputted
private JPanel questionAnswerPanel = new JPanel(); //The JPanel that will hold questionAnswer JLabel
public String x = this.question.getText(); //This string variable will hold the text entered into the JTextField question
//the buttons for ending the game, or creating new game
public JButton endGame = new JButton("End Game"); //This will end the game and create an output file
public JButton newGame = new JButton("New Game"); //This will restart the game
/** Default constructor for the GUI. Assigns Model and View, identifies controllers
* and draws the layout
* @param newGame The Model for the game
*/
public MagicEightBallGUI(MagicEightBallModel newGame)
{
super();
this.game = newGame;
this.game.setGUI(this);
this.layoutView();
this.registerControllers();
this.update();
}
/** Draws the initial layout for the game board
*/
private void layoutView()
{
//The JPanel that holds the JTextField, where the user will input a question
JPanel questionPanel = new JPanel();
questionPanel.add(this.question);
questionPanel.setBorder(BorderFactory.createTitledBorder("Ask a question"));
//The JPanel that holds the outputLabel, where the program will present an output
questionAnswerPanel = new JPanel();
questionAnswerPanel.add (this.questionAnswer);
questionAnswerPanel.setBorder(BorderFactory.createTitledBorder("Prediction"));
//The JPanel that will hold the buttons
//The end game button and the new game button
JPanel buttonPanel = new JPanel();
buttonPanel.add(newGame);
buttonPanel.add(endGame);
buttonPanel.setLayout(new GridLayout(1,2));
buttonPanel.setBorder(BorderFactory.createTitledBorder("Options"));
//The JPanel that holds the question JPanel so it can be centered
JPanel center = new JPanel();
center.setLayout(new BorderLayout());
center.add(questionPanel, BorderLayout.CENTER);
//The complete layout
this.setLayout(new BorderLayout());
this.add(center, BorderLayout.NORTH);
this.add(questionAnswerPanel, BorderLayout.CENTER);
this.add(buttonPanel, BorderLayout.SOUTH);
}
/**Assigns the controllers to the user input text field.
*/
private void registerControllers()
{
//the controller for the JTextField (question)
MagicEightBallController questionController = new MagicEightBallController(this.game);
this.question.addActionListener(questionController);
//The controller for the new game button
MagicEightBallButtonsController newGameController = new MagicEightBallButtonsController(this.game);
this.newGame.addActionListener(newGameController);
//The controller for the end game button
MagicEightBallButtonsController endGameController = new MagicEightBallButtonsController(this.game);
this.endGame.addActionListener(endGameController);
}
/** Redraws the game board according to the current game situation. Requires data
* from the Model.
*/
public void update()
{
x.trim();
//This will use the method in the model called getRoundsDone()
//this if statement will check if the rounds has reached the limit of 10 rounds or not
//if the method getRoundsDone() returns false, then disable the JTextField
if(this.game.getRoundsDone() == false)
{
this.question.setEnabled(false);
}
//All the "else if" statments will check whether the question asked will contain words that do not represent a yes/no question
//If the question does, then it will execute code from another method in the model called extraWords(int)
else if(x.contains("how much") || x.contains("How much") || x.contains("How many") || x.contains("how many") || x.contains("how can") || x.contains("How can"))
{
this.questionAnswerPanel.setBackground(Color.BLUE);
this.questionAnswer.setOpaque(true);
this.questionAnswer.setBackground(Color.BLUE);
this.questionAnswer.setForeground(Color.WHITE);
this.questionAnswer.setText(this.game.extraWords(1 + (int)(Math.random()*2)));
}
else if(x.contains("how do") || x.contains("how does") || x.contains("How do") || x.contains("How does"))
{
this.questionAnswer.setText(this.game.extraWords(3));
questionAnswerPanel.setBackground(Color.BLUE);
questionAnswer.setOpaque(true);
questionAnswer.setBackground(Color.BLUE);
questionAnswer.setForeground(Color.WHITE);
}
else if(x.contains("what is") || x.contains("What is"))
{
this.questionAnswer.setText(this.game.extraWords(4));
questionAnswerPanel.setBackground(Color.BLUE);
questionAnswer.setOpaque(true);
questionAnswer.setBackground(Color.BLUE);
questionAnswer.setForeground(Color.WHITE);
}
//This will execute if the user asked a yes/no question
else
{
this.questionAnswer.setText(this.game.resultReturned());
questionAnswerPanel.setBackground(Color.BLUE);
questionAnswer.setOpaque(true);
questionAnswer.setBackground(Color.BLUE);
questionAnswer.setForeground(Color.WHITE);
}
}//end of method update()
}//end of class