Графический интерфейс Java Tic Tac Toe

Код работает нормально, но проблема в том, что мне нужно 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();

}

}

person user2694776    schedule 19.08.2013    source источник
comment
Это МНОГО кода. Вы получите помощь намного быстрее, если отредактируете свой код и включите только те части, которые имеют отношение к вопросу. Например, ни одно из трех перечислений не имеет значения.   -  person Andrew Martin    schedule 19.08.2013
comment
Андрей спасибо..я отредактировал..   -  person user2694776    schedule 19.08.2013
comment
@user2694776 user2694776 Способ принять мой, а затем отменить через несколько секунд. ;) Хаха. Да ладно, чувак, у этого парня 90 тысяч репутации, ему это не нужно.   -  person    schedule 19.08.2013


Ответы (3)


я хочу 3 столбца и три строки. Но вывод показывает 6 столбцов

Вам нужно указать правильные параметры для GridLayout:

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

Это сообщит сетке, чтобы она содержала 3 столбца. Количество рядов будет зависеть от количества добавляемых компонентов.

person camickr    schedule 19.08.2013

Я хочу 3 столбца и три строки... Но вывод показывает 6 столбцов

Используйте 1_

Измените nRows и nColumns в зависимости от того, сколько столбцов и строк вы хотите, т. е. если вы хотите 20x20 игру, которую вы будете использовать, this.setLayout(new GridLayout(20, 20));

person Community    schedule 19.08.2013

Изменение в вашем классе 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);
   }
 }

To

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);
   }
 }
person ZeusNet    schedule 19.08.2013
comment
i.qkme.me/3vjgab.jpg Новые строки и пробелы помогут сделать ваш код более понятным. Это поможет сравнить с оригиналом и облегчит чтение. - person Ryan Amos; 19.08.2013
comment
@RyanAmos Однажды я написал целую программу в одну строку ради удовольствия. public class example { public static void main(String args[]) { System.out.println("hahaha"); } } - Довольно сложно читать. - person ; 19.08.2013
comment
Спасибо за исправление! @DummyCode В основном это шаблонный код, поэтому его легко читать. Вложенные циклы for становятся менее шаблонными и, следовательно, их труднее читать без пробелов. - person Ryan Amos; 19.08.2013