簡體   English   中英

使用Swing按鈕重置應用程序

[英]Reset Application with Swing button

嘗試使用“再次播放” 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();
    }
}

對於“再次播放”按鈕,我正在考慮重置計數器並使游戲按鈕中存儲的所有值無效。 我將在播放器移動其他if語句的同一循環中實現此功能。

我已經為此工作了一段時間,但沒有任何建議嗎? 謝謝

有那么多退出按鈕,您只能退出。 這是一些代碼改進:

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 ();
    }
}

一些提示:

  • 不要在注釋中重復您編寫的代碼。
  • 不要評論,每個Java程序員都應該知道(構造函數的外觀,什么是屬性實例化。
  • 僅在必須使用的地方使用屬性。 JPanels通常僅在ctor中使用-不需要在其他位置進行訪問。
  • 如果您不引用變量(主啟動器),請不要使用引用。
  • 為什么不將addActionListener放入循環中?
  • (a.getSource() == optButtons[0])什么是optButtons [0]? 如果您改用a.getActionCommand ().equals ("Play Again") ,則代碼本身就是文件。
  • 使用數組是一個好主意。 更進一步!
  • setSize / ... location / ... visible-沒有它怎么辦?
  • 請享用。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM