Reputation: 1
I am having some logic errors with my Boggle Project and can't pinpoint them. The the only thing I can do is exit out of the boggle game. Can anyone help me out? In this program I need to start a new game whenever the JMenu Item new game is clicked, the letters to randomize whenever the Shake Dice button is clicked, the Jpanel that contains the submit word Jbutton along with the score and current word jlabels, and for the current word label to update whenever the submit word button is clicked and for the score to update.
Boggle UI Code:
package userInterface;
/**
*
* @author Zac
*/
import core.Board;
import core.Die;
import javax.swing.*;
import javax.swing.Timer;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
public class BoggleUi extends JFrame{
Board boggleBoard;//creating a board object
//components
private static JMenuBar menuBar;//declare menubar
private static JMenu Boggle;// declare Jmenu
private static JMenuItem game;// set menu item for game
private static JMenuItem exit;// set menu item for exit
//buttons
private static JButton Shakedice;//button for shaking the dice
private static JButton submitWord;// button to submit word
//layout of the UI
private JPanel diceButtons;//jpanel for the dice buttons
private JPanel componentLayout;//jpanel for other components
private JPanel wordPanel;// Jpanel for word related ui
private static JScrollPane scrollPane;//scrollpane
private static JTextArea textArea;//textarea
private static JLabel timeLeft;// Jlabel for countdown
private static JLabel timer;//label for above time left
private static JLabel wordsLeft;//label for words entered in text area
private static JLabel currentWord;//label for current word
private static JLabel playerScore;// label for score
private static JLabel dieButton;// label for dice button
//handlers
private GameListener gameListener;// listener for the Boggle game
private PanelListener panelListener;// listener for dice
//timer variables
int timeMili; //miliseconds
int timeMin;// minutes
int timeSec;//seconds
Timer countdownTimer;//timer
public BoggleUi(Board boggleBoard,ArrayList Readdictionary ){
this.boggleBoard = boggleBoard;//calls the boggle board
initComponents();
}
public void initComponents(){ //initialzes components
this.setSize(800,800);//set size of JFrame
this.setDefaultCloseOperation(EXIT_ON_CLOSE);//remove window if closed
menuBar = new JMenuBar();//creates a menu bar
Boggle = new JMenu("Boggle");
game = new JMenuItem("New Game");// menu item for new game
exit = new JMenuItem("Exit");// menu item for exiting the game
exit.addActionListener(new ExitListener());//adding an action listener to the exit menu item
Boggle.add(game);
Boggle.add(exit);
menuBar.add(Boggle);
this.setJMenuBar(menuBar);
//actionlistener
gameListener = new GameListener();//make a new game listener
game.addActionListener(gameListener);//add game listener
panelListener = new PanelListener();//make new panel listener
Boggle.addActionListener(panelListener);// add panel listener
Shakedice = new JButton("Shake Dice");
Shakedice.addActionListener(new ShakeListener());// make shake listener
submitWord = new JButton("Submit Word");
submitWord.addActionListener(new SubmitWordListener());// make submit listener
//inititialize timer and listener
countdownTimer = new Timer(1000, new TimerListener());//setting timer and listener
countdownTimer.start();// start timer
//set up textarea and jscroll pane and other components
Dicepanels();//set up for panels and components
textArea = new JTextArea();//creates new text area
textArea.setLineWrap(true);//wraps text
scrollPane = new JScrollPane(textArea);//creates new scroll pane
scrollPane.setMinimumSize(new Dimension(200, 300));// set minimum size
scrollPane.setPreferredSize(new Dimension(200, 300));// preferred size of scroll pane
scrollPane.setMaximumSize(new Dimension(400, 600));//set max size
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);//never allows horizontal bar
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);//calls for vertical bar
componentLayout.setLayout(new BoxLayout(componentLayout,BoxLayout.Y_AXIS));//sets to y axis
componentLayout.add(wordsLeft);
componentLayout.add(scrollPane);//appears after a certain amount of lines are entered
componentLayout.add(timer);// adds time left label
componentLayout.add(timeLeft);//adds time label
componentLayout.add(Shakedice);//adds shake dice button
this.add(diceButtons);//adds dice buttons
this.add(componentLayout,BorderLayout.EAST);//adds the components
this.add(wordPanel,BorderLayout.SOUTH);//adds word panel
this.setVisible(true);// makes the entire jframe visible
}
private JFrame getThisParent(){// method to retrieve the JFrame
return this;
}
//code for text area
public void updateText(String boggleData){//method to update the text
textArea.append(boggleData+ "\n");
textArea.setCaretPosition(textArea.getDocument().getLength());
}
//area to place dice buttons and other components
private void Dicepanels() {
//setup dice buttons
diceButtons = new JPanel(new GridLayout(4, 4));// set buttons in a 4x4 grid
diceButtons.setMinimumSize(new Dimension(400, 400));//set minimum size
diceButtons.setPreferredSize(new Dimension(400, 400));//set preferred size
//setup components
componentLayout = new JPanel();
wordsLeft = new JLabel("Enter Words Found");
timer = new JLabel("Time Left");
timeLeft = new JLabel("3:00");//JLabel for timer
timeLeft.setMinimumSize(new Dimension(500,500));//sets size for label
Shakedice = new JButton("Shake Dice");
//dimensions for the shake dice button
Shakedice.setMinimumSize(new Dimension(120, 60));
Shakedice.setPreferredSize(new Dimension(120, 60));
Shakedice.setMaximumSize(new Dimension(120, 60));
Shakedice.setFont(null);//font size
//setup Word panel
wordPanel = new JPanel();
currentWord = new JLabel();// label to show current word
playerScore = new JLabel("Score:" + "0");// label that shows the player's score
submitWord = new JButton("Submit Word");
//dimensions for the submit word button
submitWord.setMinimumSize(new Dimension(100, 50));
submitWord.setPreferredSize(new Dimension(100, 50));
submitWord.setMaximumSize(new Dimension(100, 50));
submitWord.setFont(null);//font size
//JButton ArrayList
ArrayList <Die> dice = boggleBoard.shakeDice();
int counter = 0;
for(int row = 0; row < 4; row++){
for(int col = 0; col < 4; col++){
Die die = dice.get(counter);
JButton button = new JButton();
button.setText(die.getLetter());
button.putClientProperty("letter",die.getLetter());
button.putClientProperty("row",row);
button.putClientProperty("col",col);
diceButtons.add(button);
diceButtons.setFont(null);
counter++;
}
}
}
private class ExitListener implements ActionListener { //action for exiting
public void actionPerformed(ActionEvent e)
{
//dialogue to confirm quiting the game
int response = JOptionPane.showConfirmDialog(null, "Confirm to exit Boggle?",
"Exit?", JOptionPane.YES_NO_OPTION);
if (response == JOptionPane.YES_OPTION)
System.exit(0);//exit game
}
}
private class GameListener implements ActionListener{//implement actionlistener for game
public void actionPerformed(ActionEvent e){
textArea.revalidate();//revailidate text area
timeLeft.repaint(); //repaint time left Jpanel
Shakedice.setEnabled(true);//reenable shake dice button
}
}
private class ShakeListener implements ActionListener{
public void actionPerformed(ActionEvent e){
boggleBoard.shakeDice();//call shake dice method into shake listener
//Random randomDie = new Random();//new radomization
//String placement = randomDie.(diceButtons);
diceButtons.revalidate();// revalidates dice buttons
playerScore.repaint();//reset score
playerScore.setText("Score:" + "0");// set to 0
currentWord.repaint();// reset current word
timeLeft.repaint();// reset timer
Shakedice.setEnabled(false);//disable shake dice button
}
}
private class SubmitWordListener implements ActionListener{
boolean wordValidate = false;
public void actionPerformed(ActionEvent e){
if(wordValidate = true){
System.out.println("TemporaryDictionary.txt");
textArea.append("" + currentWord);
currentWord.revalidate();//update current word j label
}
}
}
private class PanelListener implements ActionListener{
public void actionPerformed(ActionEvent e){
ArrayList <JButton> buttons = new ArrayList<JButton>();
if(e.getSource()instanceof JButton){
//create Jbutton with get properties
JButton button = (JButton)e.getSource();
String letter = button.getClientProperty("letter").toString();
int rowClick = (int) button.getClientProperty("row");
int colClick = (int) button.getClientProperty("col");
//get text in label
String word = currentWord.getText();
currentWord.setText(word + letter);
int MIN_INDEX = 0;// minimum index
int MAX_INDEX = 3;// maximum index
// enable/disable the buttons
int count = 0;
for(int row = 0; row < 4;)
for(int col = 0; col < 4;){
if(row == rowClick && col == colClick)
button.setEnabled(false);
if(colClick > MIN_INDEX && colClick < MAX_INDEX && rowClick > MIN_INDEX && rowClick < MAX_INDEX){
buttons.get(count).setEnabled(true);
count++;
}
}
}
}
}
private class TimerListener implements ActionListener{
public void actionPerformed(ActionEvent e){
timeMili -= 1000;
//conversion into minutes and seconds
if(timeSec == 0){
timeSec = 59;
timeMin --;
}
else{
timeSec --;
}
timeLeft.setText("3:00");//enable time left to start countdown
}
}
}
Upvotes: 0
Views: 112
Reputation: 86
If you're running this in an IDE such as eclipse, you can place a breakpoint, then run your application and step through it, to see just what your code is really doing.
If you don't have access to a debugger, you could simply use System.out.println()
calls to report the current state of your program - it's not elegant, but it works.
Upvotes: 1