简体   繁体   中英

Reset Application with Swing button

Trying to reset the buttons with a "Play again" JButton.

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.Toolkit;
import java.awt.Image;

public class HW4_TicTacToePanel extends JFrame implements ActionListener {

// declare variables and arrays
    private int counter = 0;
    private String letter;
    private boolean win = false;
    private int[][] winConditions = new int[][]{
        {0, 1, 2}, {3, 4, 5}, {6, 7, 8}, //Horizontal wins
        {0, 3, 6}, {1, 4, 7}, {2, 5, 8}, //Vertical wins
        {0, 4, 8}, {2, 4, 6} //Diagonal wins
    };
    // JFrame Instructions
    //  private JButton buttons[] = new JButton[12];
    //  private JFrame gamewindow = new JFrame("Tic Tac Toe");
    // End JFrame
    // Panel demo
    private JPanel southPanel; //panel for replay and exit button
    private JButton[] optButtons;//Exit and replay buttons
    private JPanel centerPanel;
    private JButton[] gameButtons;//Tic tac toe squares
    private GridLayout myGridLayout;

    // End panel demo
    public HW4_TicTacToePanel() //Constructor
    {
        super("Tic Tac Toe"); //super calls the JFrame controller
        southPanel = new JPanel();// instantiate panel
        optButtons = new JButton[2];//create an array of 2 buttons
        String[] buttonNames = {"Play Again", "Exit"};

        centerPanel = new JPanel(); //instantiate panel
        gameButtons = new JButton[9];//creates an array of 9 buttons
        myGridLayout = new GridLayout(3, 3, 2, 2);

        setLayout(new BorderLayout());//set layout for JPanel
        centerPanel.setLayout(myGridLayout);//set Layout for center panel

        // add buttons to the centerPanel and add the ActionListener
        for (int i = 0; i < gameButtons.length; i++) {
            gameButtons[i] = new JButton();
            centerPanel.add(gameButtons[i]);
            gameButtons[i].addActionListener(this);
        }

        add(centerPanel, BorderLayout.CENTER); //add panel to JFrame

        // add buttons to the southPanel and add the ActionListener
        for (int i = 0; i < optButtons.length; i++) {
            optButtons[i] = new JButton(buttonNames[i]);
            southPanel.add(optButtons[i]);
        }

        //add functionality to replay and exit buttons
        optButtons[0].addActionListener(this);
        optButtons[1].addActionListener(this);

        add(southPanel, BorderLayout.SOUTH); //adds panel to JFrame
    }

    public void actionPerformed(ActionEvent a) {
        // Add Image icons
        counter++;

         //Calculate whose turn it is by using modulus to determine even or odd
    if (counter % 2 == 0) {
        letter = "O";
        Icon o = new ImageIcon(getClass().getResource("O.gif"));
        //Capture and show player input then disable button so it may not be reselected
        JButton pressedButton = (JButton) a.getSource();
        pressedButton.setIcon(o);
        pressedButton.setText(letter);
        pressedButton.setEnabled(false);
    } else if (a.getSource() == optButtons[0])
    {
        //
        //play again Instructions
        //
        System.exit(0);
    } else if (a.getSource() == optButtons[1])
    {
        System.exit(0);
    } else {
        letter = "X";
        Icon x = new ImageIcon(getClass().getResource("X.gif"));
        //Capture and show player input then disable button so it may not be reselected
        JButton pressedButton = (JButton) a.getSource();
        pressedButton.setIcon(x);
        pressedButton.setText(letter);
        pressedButton.setEnabled(false);
    }

//determine who won
        for (int i = 0; i <= 7; i++) {
            if (gameButtons[winConditions[i][0]].getText().equals(gameButtons[winConditions[i][1]].getText())
                    & gameButtons[winConditions[i][1]].getText().equals(gameButtons[winConditions[i][2]].getText())
                    & gameButtons[winConditions[i][0]].getText() != "") {
                win = true;
            }
        }

//Show victor dialog
        if (win == true) {
            JOptionPane.showMessageDialog(null, letter + " wins the game!");
            //Remove once optButtons are operational...
            System.exit(0);
        } else if (counter == 9 && win == false) {
            JOptionPane.showMessageDialog(null, "The game was a tie!");
            //Remove once optButtons are operational...
            System.exit(0);
        }
    }

    public static void main(String[] args) {
        HW4_TicTacToePanel starter = new HW4_TicTacToePanel();
    }
}

For the Play Again button I was thinking of reseting the counter and nullifying any values stored in the game buttons. I would implement this in the same loop as the player moves as an else if statement.

I've been working on this for a little while to no avail, any advice? Thanks

With that many exit buttons, you can only exit. Here is some code improvement:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.Toolkit;
import java.awt.Image;

public class HW4_TicTacToePanel extends JFrame implements ActionListener {
    private int counter = 0;
    private int [] [] winConditions = new int [] [] {
        {0, 1, 2}, {3, 4, 5}, {6, 7, 8}, // Horizontal wins
        {0, 3, 6}, {1, 4, 7}, {2, 5, 8}, // Vertical wins
        {0, 4, 8}, {2, 4, 6} // Diagonal wins
    };
    private JButton [] gameButtons;

    public HW4_TicTacToePanel ()
    {
        super ("Tic Tac Toe");
        JPanel southPanel = new JPanel ();
        JButton [] optButtons = new JButton [2];
        String [] buttonNames = {"Play Again", "Exit"};
        JPanel centerPanel = new JPanel (); 
        gameButtons = new JButton [9];
        GridLayout myGridLayout = new GridLayout (3, 3, 2, 2);
        setLayout (new BorderLayout ());
        centerPanel.setLayout (myGridLayout);
        for (int i = 0; i < gameButtons.length; i++) {
            gameButtons [i] = new JButton ();
            centerPanel.add (gameButtons [i]);
            gameButtons [i].addActionListener (this);
        }

        add (centerPanel, BorderLayout.CENTER); 
        for (int i = 0; i < optButtons.length; i++) {
            optButtons [i] = new JButton (buttonNames [i]);
            southPanel.add (optButtons [i]);
            optButtons [i].addActionListener (this);            
        }
        add (southPanel, BorderLayout.SOUTH); 
        setSize (300, 300);
        setLocation (200, 200);
        setVisible (true);
    }

    private static Icon [] icon = new ImageIcon [] {
        new ImageIcon ("/home/stefan/some/images/mini.null.jpg"), 
        new ImageIcon ("/home/stefan/daten/some/images/x.gif")};
    private static String [] letter = new String [] {"x", "o"}; 

    public void actionPerformed (ActionEvent a) {
        // Add Image icons
        counter++;
        boolean win = false;
        String cmd = a.getActionCommand ();
        if (cmd.equals ("Play Again"))
        {
            dispose ();
            HW4_TicTacToePanel.main (null); 
        } 
        else if (cmd.equals ("Exit"))
        {
            dispose ();
        } else {
            // Calculate whose turn it is by using modulus to determine even or odd
            JButton pressedButton = (JButton) a.getSource ();
            pressedButton.setIcon (icon [counter%2]);
            pressedButton.setText (letter[counter%2]);
            pressedButton.setEnabled (false);
        }
        //determine who won
        for (int i = 0; i <= 7; i++) {
            if (gameButtons [winConditions [i] [0]].getText ().equals (gameButtons [winConditions [i] [1]].getText ())
            & gameButtons [winConditions [i] [1]].getText ().equals (gameButtons [winConditions [i] [2]].getText ())
            & gameButtons [winConditions [i] [0]].getText () != "") {
                win = true;
            }
        }
        //Show victor dialog
        if (win == true) {
            JOptionPane.showMessageDialog (null, letter[counter%2] + " wins the game!");
        } else if (counter == 9 && win == false) {
            JOptionPane.showMessageDialog (null, "The game was a tie!");
        }
    }

    public static void main (String [] args) {
        new HW4_TicTacToePanel ();
    }
}

Some hints:

  • Don't repeat in comments what you've written in code.
  • Don't comment things, every Java programmer should know (how a Constructor looks like, what attribute instantiation is.
  • Only use attributes where you have to. JPanels are usually only used in the ctor - they don't need to be accessible somewhere else.
  • If you don't reference a variable (starter in main) - don't use a reference.
  • why didn't you put the addActionListener into the loop?
  • (a.getSource() == optButtons[0]) what is optButtons[0]? If you use a.getActionCommand ().equals ("Play Again") instead, the code documents itself.
  • Usage of arrays was a good idea. Take it a step further!
  • setSize/...location/...visible - how could you work without it?
  • enjoy. :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM