Пробел в старом Java GUI Tic-Tac-Toe

Итак, я хотел изучить GUI на Java, и в этой книге, которая у меня была (ей 6 лет), я попытался скопировать образец их TicTacToe.java

Независимо от того, были ли используемые заявления устаревшими, или мне нужно кое-что узнать, прежде чем выходить и пробовать эти вещи, я действительно не мог понять, почему на экране ничего не появляется.

Вот мой код (простите нечетные имена и тексты):

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

import javax.swing.JButton;
import javax.swing.JFrame;

public class FranzTicTacToe extends JFrame implements ActionListener
{
private Container c = getContentPane();
private JButton[][] gameBoard = new JButton[3][3];



private ImageIcon imageo = new ImageIcon("C:\\Users\\hftri\\Downloads\\tic.jpg");
private ImageIcon imagex = new ImageIcon("C:\\Users\\hftri\\Downloads\\tac.jpg");

private String turn = "Aloysius";
    boolean isGameOver = false;

    public void TicTacToe()
    {
        c = getContentPane();
        gameBoard = new JButton[3][3];
        imageo = new ImageIcon("C:\\Users\\hftri\\Downloads\\tic.jpg");
        imagex = new ImageIcon("C:\\Users\\hftri\\Downloads\\tac.jpg");
        isGameOver = false;
        c.setLayout(new GridLayout(3,3));
        setTitle("Harambe");
        setBounds(250, 250, 300, 300);

        for(int column=0; column < 3; column++)
        {
            for(int row=0; row < 3; row++)
            {
                gameBoard[column][row] = new JButton();
                c.add(gameBoard[column][row]);
                gameBoard[column][row].addActionListener(this);
            }
        }
    }
    public void actionPerformed(ActionEvent e)
    {
        if(isGameOver)
            return;

        JButton pressedButton = (JButton)e.getSource();
        int pressedColumn = -1, pressedRow = -1;

        for(int column=0; column < 3; column++)
        {
            for(int row=0; row < 3; row++)
            {
                if(gameBoard[column][row] == pressedButton)
                {
                    pressedColumn = column;
                    pressedRow = row;
                }
            }
        }

        //Game START

        if(gameBoard[pressedColumn][pressedRow].getIcon() != null)
        {
            return;
        }

        if(turn.equals("Aloysius"))
        {
            gameBoard[pressedColumn][pressedRow].setIcon(imagex);
            turn = "Johpit";
        }

        else
        {
            gameBoard[pressedColumn][pressedRow].setIcon(imageo);
            turn = "Aloysius";
        }

        if(checkRow(pressedRow, imageo) || checkColumn(pressedColumn, imageo) || checkDiagonals(imageo))
        {
            isGameOver = true;
            JOptionPane.showMessageDialog(FranzTicTacToe.this, "Aloysius is skrub", "Result", JOptionPane.INFORMATION_MESSAGE);
            turn = "Johpit";

            playAgain();
        }

        if(checkRow(pressedRow, imagex) || checkColumn(pressedColumn, imagex) || checkDiagonals(imagex))
        {
            isGameOver = true;
            JOptionPane.showMessageDialog(FranzTicTacToe.this, "Johpit is skrub", "Result", JOptionPane.INFORMATION_MESSAGE);
            turn = "Aloysius";

            playAgain();
        }

        if(!isGameOver)
        {
            boolean tie = true;

                for(int column=0; column < 3; column++)
                {
                    for(int row=0; row < 3; row++)
                    {
                        if(gameBoard[column][row].getIcon() == null)
                        {
                            tie = false;
                            break;
                        }
                    }
                }
                if(tie)
                {
                    JOptionPane.showMessageDialog(FranzTicTacToe.this, "Both of you are fukin skrubs", "Result", JOptionPane.INFORMATION_MESSAGE);
                    isGameOver = true;

                    playAgain();
                }
            }

            if(!isGameOver)
            {
                setTitle(turn + "'s turn");
            }
        }
        boolean checkRow(int row, Icon player)
        {
            for(int column=0; column < 3; column++)
            {
                if(gameBoard[column][row].getIcon() != player)
                {
                    return false;
                }
            }
            return true;
        }

        boolean checkColumn(int column, Icon player)
        {
            for(int row=0; row < 3; row++)
            {
                if(gameBoard[column][row].getIcon() != player)
                {
                    return false;
                }
            }
            return true;
        }

        boolean checkDiagonals(Icon player)
        {
            if(gameBoard[1][1].getIcon() != player)
            return false;

            if(gameBoard[0][0].getIcon() == player && gameBoard[2][2].getIcon() == player)
            {
                return true;
            }

            return false;
        }

        //Game Restarting Option

        void playAgain()
        {
            Object[] options = {"Yes", "No"};
            int n = JOptionPane.showOptionDialog(FranzTicTacToe.this, "Pusta again?", "Query", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]);

            if(n == JOptionPane.YES_OPTION)
            {
                dispose();
                FranzTicTacToe game = new FranzTicTacToe();
                game.setVisible(true);
            }
            else
            {
                System.exit(0);
            }
        }
        public static void main(String[] args)
        {
            FranzTicTacToe game = new FranzTicTacToe();
            game.addWindowListener(new WindowAdapter()
            {
                public void windowClosing(WindowEvent e)
                {
                    System.exit(0);
                }
            });

            game.setVisible(true);
        }
    }

Я сделал "Aloysius" значение для x и "Johpit" значение для o из любопытства и веселья.

Во всяком случае, я новичок в GUI на Java, и я хотел попробовать это, чтобы затем я мог изучить каждую его часть медленно. Весь этот код показывает пустое окно. Есть идеи?

Спасибо:)

2 ответа

Решение

Вы скучаете по конструктору. Прямо сейчас он использует конструктор по умолчанию, который по сути ничего не делает. Вероятно, это орфографическая ошибка, но ради понимания. Если конструктор не объявлен, он будет использовать конструктор по умолчанию из Object учебный класс.
Конструктор также должен иметь точное имя в качестве класса. Так что поменяй TicTacToe метод для FranzTicTacToe конструктор

 public void TicTacToe() // needs to be public FranzTicTacToe()
    {
        c = getContentPane();
        gameBoard = new JButton[3][3];
        imageo = new ImageIcon("C:\\Users\\hftri\\Downloads\\tic.jpg");
        imagex = new ImageIcon("C:\\Users\\hftri\\Downloads\\tac.jpg");
        isGameOver = false;
        c.setLayout(new GridLayout(3,3));
        setTitle("Harambe");
        setBounds(250, 250, 300, 300);
    for(int column=0; column < 3; column++)
    {
        for(int row=0; row < 3; row++)
        {
            gameBoard[column][row] = new JButton();
            c.add(gameBoard[column][row]);
            gameBoard[column][row].addActionListener(this);
        }
    }
}

Вы переименовали класс, но забыли переименовать конструктор, а затем исправили его неправильно. Короче:

public void TicTacToe()

должно быть

public FranzTicTacToe()
Другие вопросы по тегам