java - 由按钮组成的面板网格

标签 java swing jbutton grid-layout tic-tac-toe

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

public class Game extends JFrame implements ActionListener {

private JPanel panel;
private JButton[] button;
private int count = 0;
private int sign = 0;


public Game(){
    panel = new JPanel();
    panel.setLayout(new GridLayout(3,3));
    add(panel);
    button = new JButton[9];
    for (int i = 0; i < 9; i++){
        button[i] = new JButton();
        button[i].setPreferredSize(new Dimension(100,100));
        panel.add(button[i]);
        button[i].setEnabled(true);
        button[i].addActionListener(this);
        button[i].setFont(new Font("Arial", Font.PLAIN, 30));
    }

    pack();
    setVisible(true);
}


public void actionPerformed(ActionEvent e){
    count ++;
    int i = 0;
    for(i = 0; i < 9; i++){
        if(button[i] == e.getSource()){
            if(sign % 2 == 0){
                button[i].setText("X");
                button[i].setEnabled(false);
            }
            else {
                button[i].setText("O");
                button[i].setEnabled(false);
            }
            break;
        }
    }

    if(isAWinner(i) && count > 2){

        JOptionPane.showMessageDialog(null, "" + button[i].getText() + "s Win");
        for(int j = 0; j < 9; j++){
            button[j].setText("");
            button[j].setEnabled(true);
        }
        count = 0;
        sign = 0;
        return;
    }



    if(count >= 9){
        JOptionPane.showMessageDialog(null, "Cat's Game!");  
        for(int j = 0; j < 9; j++){  
            button[j].setText("");  
            button[j].setEnabled(true);  
        }  
        count = 0;  
        sign = 0;  
        return;  
    }  

    sign++;  

}  

所以这很好用,井字游戏本身没有问题 我的问题是当我尝试制作这些游戏的网格时

import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.JFrame;

public class TicTacTest{

public static void main(String[] args) {

    JFrame frame = new JFrame();
    frame.setTitle("Super TicTacToe");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(900,900);
    Container pane = frame.getContentPane();
    pane.setLayout(new GridLayout(3,3));

        Game[] games = new Game[9];

        for(int i = 0; i < 9; i++){

            games[i] = new Game();
            pane.add(games[i]);
        }


        frame.setVisible(true);

    }

}

我认为这会起作用,但显然我错了,因为什么也没有显示。

我的主体中应该有什么来制作 9 个 Tic Tac Toe 板?

最佳答案

Game 扩展自 JFrame,它无法添加到其他类型的容器中(这很愚蠢)

异常(exception)情况已经说明了这一点......

Exception in thread "main" java.lang.IllegalArgumentException: adding a window to a container   
    at java.awt.Container.checkNotAWindow(Container.java:488)   
    at java.awt.Container.addImpl(Container.java:1089)  
    at java.awt.Container.add(Container.java:415)

相反,让 GameJPanel 扩展,然后将其添加到您想要的任何容器

类似...

TicTacToe

(ps,红色边框仅供演示)

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;

public class Test {

    public static void main(String[] args) {

        JFrame frame = new JFrame();
        frame.setTitle("Super TicTacToe");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(900, 900);
        Container pane = frame.getContentPane();
        pane.setLayout(new GridLayout(3, 3));

        Game[] games = new Game[9];

        for (int i = 0; i < 9; i++) {

            games[i] = new Game();
            games[i].setBorder(new LineBorder(Color.RED));
            pane.add(games[i]);
        }

        frame.setVisible(true);

    }

    public static class Game extends JPanel implements ActionListener {

        private JButton[] button;
        private int count = 0;
        private int sign = 0;

        public Game() {
            setLayout(new GridLayout(3, 3));
            button = new JButton[9];
            for (int i = 0; i < 9; i++) {
                button[i] = new JButton();
                button[i].setPreferredSize(new Dimension(100, 100));
                add(button[i]);
                button[i].setEnabled(true);
                button[i].addActionListener(this);
                button[i].setFont(new Font("Arial", Font.PLAIN, 30));
            }
        }

        public void actionPerformed(ActionEvent e) {
            count++;
            int i = 0;
            for (i = 0; i < 9; i++) {
                if (button[i] == e.getSource()) {
                    if (sign % 2 == 0) {
                        button[i].setText("X");
                        button[i].setEnabled(false);
                    } else {
                        button[i].setText("O");
                        button[i].setEnabled(false);
                    }
                    break;
                }
            }

            if (isAWinner(i) && count > 2) {

                JOptionPane.showMessageDialog(null, "" + button[i].getText() + "s Win");
                for (int j = 0; j < 9; j++) {
                    button[j].setText("");
                    button[j].setEnabled(true);
                }
                count = 0;
                sign = 0;
                return;
            }

            if (count >= 9) {
                JOptionPane.showMessageDialog(null, "Cat's Game!");
                for (int j = 0; j < 9; j++) {
                    button[j].setText("");
                    button[j].setEnabled(true);
                }
                count = 0;
                sign = 0;
                return;
            }

            sign++;

        }

        public boolean isAWinner(int i) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

    }
}

关于java - 由按钮组成的面板网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35353232/

相关文章:

java - JFrame 未正确加载

java - 绘制后组件不显示

java - Jackson 会抛出循环异常吗?

java - Spring Integration中文件的处理组

java - 我应该使用哪种布局来实现两列 20% 和 80%(Java)?

java swing 将 JPanel 与鼠标监听器的行 col 值相关联

java - Java 中具有双值的有限机

java - HTTP 错误 503 : can not access/. 原因 服务不可用

java - 嵌套 Swing 容器不显示

java - 使按钮不可调整大小