Пробел в старом 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()