0

コードは正常に動作しますが、問題は 3 列と 3 行が必要なことです。しかし、出力には 3 行と 3 列ではなく 6 列が表示されます

問題が発生するコードは次のとおりです。メインクラスは次のとおりです。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import games.board.Board;
import games.board.Cell;
import games.board.Mark;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;



public class TicTacToeGUIGame extends JFrame  {

/**
 * @param args
 */
private Board gb;
private int turn;
private void takeTurn(Cell c) {
    Mark curMark = (turn++ % 2 == 0)? Mark.NOUGHT
    : Mark.CROSS;
    gb.setCell(curMark, c.getRow(), c.getColumn());
    }
private TicTacToeGUIGame() {
    gb = new Board(3, 3, new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
    Cell c = (Cell) ae.getSource();
    takeTurn(c);
    }
    });
    this.add(gb);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setTitle("TIC-TAC-TOE");
    this.setSize(300, 300);
    this.setVisible(true);
    }


public static void main(String[] args) {
    // TODO Auto-generated method stub
    SwingUtilities.invokeLater( new Runnable () {
        public void run() { new TicTacToeGUIGame(); }
        });

}

}

ボードクラスは次のとおりです。

package games.board;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.JFrame;

public class Board extends JPanel {
private Cell[][] cells;
public Board(int rows, int columns) {
cells = new Cell[rows][columns];
for( int r = 0; r < cells[0].length; r++ ) {
for (int c = 0; c < cells[1].length; c++) {
cells[r][c] = new Cell(r,c);
}
}
}
public Board(int rows, int columns, ActionListener ah) {
    cells = new Cell[rows][columns];
    this.setLayout(new GridLayout());
    for( int r = 0; r < cells.length; r++ ) {
    for (int c = 0; c < cells[r].length; c++) {
    cells[r][c] = new Cell(r,c);
    this.add(cells[r][c]);
    cells[r][c].addActionListener(ah);
    }
    }
    }
public void setCell(Mark mark, int row, int column) throws
IllegalArgumentException {
if (cells[row][column].getContent() == Mark.EMPTY)
cells[row][column].setContent(mark);
else throw new IllegalArgumentException("Player already there!");
}
public Cell getCell(int row, int column) {
return cells[row][column];
}
public String toString() {
StringBuilder str = new StringBuilder();
for( int r = 0; r < cells.length; r++ ) {
str.append("|"); 


for (int c = 0; c < cells[r].length; c++) {
switch(cells[r][c].getContent()) {
case NOUGHT:
    str.append("O");
    break;
    case CROSS:
    str.append("X");
    break;
    case YELLOW:
    str.append("Y");
    break;
    case RED:
    str.append("R");
    break;
    case BLUE:
    str.append("B");
    break;
    case GREEN:
    str.append("G");
    break;
    case MAGENTA:
    str.append("M");
    break;
    case ORANGE:
    str.append("M");
    break;
    default: //Empty
    str.append("");
    }
    str.append("|");
    }
    str.append("\n");
    }
    return str.toString();

}

}
4

3 に答える 3

5

私は3列と3行が欲しい..しかし、出力は6列を示しています

GridLayout に適切なパラメータを指定する必要があります。

this.setLayout(new GridLayout(0, 3));

これにより、グリッドに 3 つの列が含まれるようになります。行数は、追加するコンポーネントの数によって異なります。

于 2013-08-19T17:21:51.223 に答える
1

Board クラスの変更:

for( int r = 0; r < cells[0].length; r++ ) {
    for (int c = 0; c < cells[1].length; c++) {
      cells[r][c] = new Cell(r,c);
   }
 }

for( int r = 0; r < cells[0].length; r++ ) {
    for (int c = 0; c < cells[r].length; c++) {
      cells[r][c] = new Cell(r,c);
   }
 }
于 2013-08-19T17:21:37.270 に答える
1

3 列と 3 行が必要ですが、出力には 6 列が表示されます

使用する、this.setLayout(new GridLayout(nRows, nColumns));

必要な列と行の数に応じて変更nRowsnColumnsます。つまり、20x20使用するゲームが必要な場合は、this.setLayout(new GridLayout(20, 20));

于 2013-08-19T17:23:29.177 に答える