我正在創建一個井字游戲,并且創建了 2 個按鈕“退出”和“重播”。當我單擊任何其他按鈕時,這兩個按鈕就會消失。如果您告訴我可以做些什么來讓它們在我單擊任何其他按鈕時可見,我會很高興。
正如您在兩個螢屏截圖中看到的那樣,在我單擊任何按鈕之前,兩者都是可見的,但是當我單擊任何按鈕時,兩者都會消失,我必須將滑鼠懸停在它們上面才能再次出現。


Below is all of code
public static void main(String[] args) {
TickTacToe tik = new TickTacToe();
}
Random random = new Random();
JFrame frame = new JFrame();
JPanel title_panel = new JPanel();
JPanel button_panel = new JPanel();
JLabel textfield = new JLabel();
JButton[] buttons_array = new JButton[9];
int i =0;
JPanel panel;
JButton Replaybutton,Quitbutton;
boolean player1_turn;
TickTacToe(){
JButton Replay,Quit;
Replay = new JButton();
Replay.setText("Replay?");
Replay.setForeground(Color.cyan);
Replay.setFont(new Font("Courgette",Font.BOLD,17));
Replay.setBackground(new Color(25,60,80));
Replay.setBounds(70,10, 100,45);
Quit = new JButton();
Quit.setText("Quit!");
Quit.setForeground(Color.black);
Quit.setFont(new Font("Courgette",Font.BOLD,19));
Quit.setBackground(new Color(145,80,120));
Quit.setBounds(620, 10, 100, 45);
////////////////////////////////////////////////////////
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800,800);
frame.getContentPane().setBackground(new Color(50,50,50));
frame.setLayout(new BorderLayout());
frame.setVisible(true);
//Below line is for centring our frame in the middle.
frame.setLocationRelativeTo(null);
textfield.setBackground(Color.black);
textfield.setForeground(new Color(80,170,20));
textfield.setFont(new Font("Courgette",Font.PLAIN,50));
//The below method is for centering our text in the center.
textfield.setHorizontalAlignment(JLabel.CENTER);
textfield.setText("Tik-Tac-Toe");
textfield.setOpaque(true);
title_panel.setLayout(new BorderLayout());
title_panel.setBounds(0, 0, 800, 100);
button_panel.setLayout(new GridLayout(3,3));
button_panel.setBackground(new Color(150,150,150));
for(int i = 0; i <9;i ) {
buttons_array[i] = new JButton();
button_panel.add(buttons_array[i]);
buttons_array[i].setFont(new Font("InkFree",Font.BOLD,120));
buttons_array[i].setFocusable(false);
buttons_array[i].addActionListener(this);
}
frame.add(Replay);
frame.add(Quit);
frame.setResizable(false);
title_panel.add(textfield);
frame.add(title_panel,BorderLayout.NORTH);
frame.add(button_panel);
firstTurn();
}
@Override
public void actionPerformed(ActionEvent e) {
for(int i=0;i<9;i ) {
if(e.getSource()==buttons_array[i]) {
if(player1_turn) {
if(buttons_array[i].getText()=="") {
buttons_array[i].setForeground(Color.red);
buttons_array[i].setText("X");
player1_turn =false;
textfield.setText("O Turn");
check();
}
}
else {
if(buttons_array[i].getText()=="") {
buttons_array[i].setForeground(Color.blue);
buttons_array[i].setText("O");
player1_turn =true;
textfield.setText("X Turn");
check();
}
}
}
}
}
public void firstTurn() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(random.nextInt(2)==0) {
player1_turn = true;
textfield.setText("X Turn");
}else if(random.nextInt(2) == 1) {
player1_turn = false;
textfield.setText("O Turn");
}
}
public void check() {
// Checking for x win Conditiotns.
if(
(buttons_array[0].getText() == "X") &&
buttons_array[1].getText() == "X" &&
buttons_array[2].getText() == "X"
) {
xWins(0,1,2);
}
if(
(buttons_array[3].getText() == "X") &&
buttons_array[4].getText() == "X" &&
buttons_array[5].getText() == "X"
) {
xWins(3,4,5);
}
if(
(buttons_array[6].getText() == "X") &&
buttons_array[7].getText() == "X" &&
buttons_array[8].getText() == "X"
) {
xWins(6,7,8);
}
if(
(buttons_array[0].getText() == "X") &&
buttons_array[3].getText() == "X" &&
buttons_array[6].getText() == "X"
) {
xWins(0,3,6);
}
if(
(buttons_array[1].getText() == "X") &&
buttons_array[4].getText() == "X" &&
buttons_array[7].getText() == "X"
) {
xWins(1,4,7);
}
if(
(buttons_array[2].getText() == "X") &&
buttons_array[5].getText() == "X" &&
buttons_array[8].getText() == "X"
) {
xWins(2,5,8);
}
if(
(buttons_array[0].getText() == "X") &&
buttons_array[4].getText() == "X" &&
buttons_array[8].getText() == "X"
) {
xWins(0,4,8);
}
if(
(buttons_array[2].getText() == "X") &&
buttons_array[4].getText() == "X" &&
buttons_array[6].getText() == "X"
) {
xWins(2,4,6);
}
if(
(buttons_array[0].getText() == "O") &&
buttons_array[1].getText() == "O" &&
buttons_array[2].getText() == "O"
) {
oWins(0,1,2);
}
if(
(buttons_array[3].getText() == "O") &&
buttons_array[4].getText() == "O" &&
buttons_array[5].getText() == "O"
) {
oWins(3,4,5);
}
if(
(buttons_array[6].getText() == "O") &&
buttons_array[7].getText() == "O" &&
buttons_array[8].getText() == "O"
) {
oWins(6,7,8);
}
if(
(buttons_array[0].getText() == "O") &&
buttons_array[3].getText() == "O" &&
buttons_array[6].getText() == "O"
) {
oWins(0,3,6);
}
if(
(buttons_array[1].getText() == "O") &&
buttons_array[4].getText() == "O" &&
buttons_array[7].getText() == "O"
) {
oWins(1,4,7);
}
if(
(buttons_array[2].getText() == "O") &&
buttons_array[5].getText() == "O" &&
buttons_array[8].getText() == "O"
) {
oWins(2,5,8);
}
if(
(buttons_array[0].getText() == "O") &&
buttons_array[4].getText() == "O" &&
buttons_array[8].getText() == "O"
) {
oWins(0,4,8);
}
if(
(buttons_array[2].getText() == "O") &&
buttons_array[4].getText() == "O" &&
buttons_array[6].getText() == "O"
) {
oWins(2,4,6);
}
}
//////////////////////////////////////////////////////////////////////////////////
public void xWins(int a, int b, int c) {
buttons_array[a].setBackground(new Color(50,15,80));
buttons_array[b].setBackground(new Color(150,15,80));
buttons_array[c].setBackground(Color.BLACK);
for(int i=0;i<9;i ) {
buttons_array[i].setEnabled(false);
}
uj5u.com熱心網友回復:
介紹
Oracle 有一個有用的教程,
我使用 Swing 布局管理器創建了一個按鈕JPanel和一個井字游戲網格JPanel。您可以按您想要的任何按鈕,并且所有按鈕在JFrame.
我留下了所有的顏色和字體供你添加。
解釋
創建 Swing GUI 時,我使用模型-視圖-控制器(MVC) 模式。這種模式使我能夠分離我的關注點并一次專注于應用程式的一小部分。
對于 Swing GUI,MVC 模式定義為:
- 視圖從模型中讀取資訊。
- 視圖不會更新模型。
- 控制器更新模型并重新繪制/重新驗證視圖。
Swing GUI 可以有許多控制器類。我為這個井字游戲創建了三個控制器類。三個控制器類中的兩個被表示為 lambda 運算式,因為它們很簡單。
我創建了 5 個不同的類。一個類組成應用程式模型,一個類定義視圖,三個控制器類管理應用程式。
模型
該類GameModel是一個普通的 Java getter/setter 類,它創建一個邏輯井字棋盤并跟蹤輪到誰了。
看法
每個 Swing 應用程式都必須以呼叫該SwingUtilities invokeLater方法開始。此方法確保在Event Dispatch Thread上創建和更新 Swing 組件。
我使用 aJFrame并創建一個 buttonJPanel和一個 grid JPanel。JFrame 有一個默認的BorderLayout. 我把按鈕JPanel放在北方,把網格JPanel放在中心。
按鈕JPanel使用 a FlowLayout,而網格JPanel使用,你猜對了, a GridLayout。我在兩者周圍添加了一個空白邊框,JPanels以向 GUI 添加一些空白。
我使用了一種Box createHorizontalStrut方法來為按鈕添加一些空格JPanel。
控制器
重置按鈕和退出按鈕控制器是簡單的 lambda 運算式。
我制作了該類的九個實體MoveListener,一個用于井字游戲網格中的每個按鈕。這使得actionPerformed代碼相當簡單。唯一的邏輯是在移動之前檢查以確保方格是空的。
出于某種原因,檢查空格不起作用,所以我檢查是否缺少“X”或“O”。
代碼
這是完整的可運行代碼。我制作了附加類內部類,因此我可以將此代碼作為一個塊發布。
我測驗了這段代碼,它可以作業。在您進行大量更改之前將其保存在安全的地方,然后抱怨它不起作用。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class SimpleTicTacToeGUI implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new SimpleTicTacToeGUI());
}
private final GameModel model;
private JButton[] gridButtons;
private JFrame frame;
private JLabel turnLabel;
public SimpleTicTacToeGUI() {
this.model = new GameModel();
}
@Override
public void run() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(createButtonPanel(), BorderLayout.NORTH);
frame.add(createGrid(), BorderLayout.CENTER);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JPanel createButtonPanel() {
JPanel panel = new JPanel(new FlowLayout());
panel.setBorder(BorderFactory.createEmptyBorder(0, 5, 5, 5));
Font font = panel.getFont().deriveFont(16f);
JButton resetButton = new JButton("Replay?");
resetButton.setFont(font);
resetButton.addActionListener(event -> {
model.resetModel();
updateGUI();
enableButtons();
});
panel.add(resetButton);
panel.add(Box.createHorizontalStrut(30));
turnLabel = new JLabel(model.getTurn() "'s turn");
turnLabel.setFont(font);
panel.add(turnLabel);
panel.add(Box.createHorizontalStrut(30));
JButton quitButton = new JButton("Quit!");
quitButton.setFont(font);
quitButton.addActionListener(event -> {
frame.dispose();
System.exit(0);
});
panel.add(quitButton);
return panel;
}
private JPanel createGrid() {
JPanel panel = new JPanel(new GridLayout(0, 3));
panel.setBorder(BorderFactory.createEmptyBorder(0, 5, 5, 5));
Font font = panel.getFont().deriveFont(Font.BOLD, 72f);
gridButtons = new JButton[model.getBoard().length];
for (int index = 0; index < gridButtons.length; index ) {
gridButtons[index] = new JButton(" ");
MoveListener listener = new MoveListener(this, model, index);
gridButtons[index].addActionListener(listener);
gridButtons[index].setFont(font);
gridButtons[index].setPreferredSize(new Dimension(96, 96));
panel.add(gridButtons[index]);
}
return panel;
}
public void updateGUI() {
char[] board = model.getBoard();
for (int index = 0; index < gridButtons.length; index ) {
String s = Character.toString(board[index]);
gridButtons[index].setText(s);
}
turnLabel.setText(model.getTurn() "'s turn");
}
public void disableButtons() {
for (int index = 0; index < gridButtons.length; index ) {
gridButtons[index].setEnabled(false);
}
}
private void enableButtons() {
for (int index = 0; index < gridButtons.length; index ) {
gridButtons[index].setEnabled(true);
}
}
public JButton getButton(int index) {
return gridButtons[index];
}
public class MoveListener implements ActionListener {
private final int index;
private final SimpleTicTacToeGUI view;
private final GameModel model;
public MoveListener(SimpleTicTacToeGUI view, GameModel model,
int index) {
this.view = view;
this.model = model;
this.index = index;
}
@Override
public void actionPerformed(ActionEvent event) {
String s = view.getButton(index).getText();
if (!(s.equals("X") || s.equals("O"))) {
model.makeMove(index);
view.updateGUI();
if (model.isGameOver()) {
view.disableButtons();
}
}
}
}
public class GameModel {
private char[] board;
private char turn;
public GameModel() {
resetModel();
}
public void resetModel() {
this.board = new char[9];
this.turn = 'X';
}
public void makeMove(int index) {
board[index] = turn;
turn = (turn == 'X') ? 'O' : 'X';
}
public boolean isGameOver() {
int[][] indexes = { { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 },
{ 0, 3, 6 }, { 1, 4, 7 }, { 2, 5, 8 }, { 0, 4, 8 },
{ 2, 4, 6 } };
for (int index = 0; index < indexes.length; index ) {
if (checkRow('X', indexes[index])
|| checkRow('O', indexes[index])) {
return true;
}
}
return false;
}
private boolean checkRow(char player, int[] indexes) {
for (int index = 0; index < indexes.length; index ) {
if (board[indexes[index]] != player) {
return false;
}
}
return true;
}
public char getTurn() {
return turn;
}
public char[] getBoard() {
return board;
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/525251.html
標籤:爪哇摇摆
