2013-08-19 39 views
0

代碼工作正常,但問題是,我想3列三行。但輸出顯示6列,而不是三行三列Java的井字GUI

下面是其中出現問題的代碼。 。 這裏是一個主類:

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(); 

} 

} 
+1

這是很多代碼。如果您編輯了代碼,並且只包含與問題相關的部分,您會更快地獲得幫助。例如,三個枚舉中沒有一個是相關的。 –

+0

安德魯謝謝..我編輯它.. – user2694776

+0

@ user2694776接受我的方式,然後幾秒鐘後不接受。 ;) 哈哈。來吧,男人有90k代表,他不需要它。 – 2013-08-19 17:36:26

回答

5

我想3列三行。但輸出顯示6列

你需要指定適當的參數給網格佈局:

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

這將告訴網格包含3列。行數取決於您添加的組件數量。

+0

擊敗我吧+1。 – 2013-08-19 17:26:56

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); 
    } 
} 
+1

http://i.qkme.me/3vjgab.jpg換行符和空格將有助於使代碼更清晰。這將有助於與原文進行比較,並且它會使閱讀更容易。 –

+0

你說得對,有點不注意,對不起。 – ZeusNet

+0

@RyanAmos我曾經爲了它的樂趣在一行中寫過整個程序。 '公共類示例{公共靜態無效的主要(字符串參數[]){System.out.println(「哈哈哈」); }} - 相當難讀。 – 2013-08-19 17:30:02

1

我想3列三行......但輸出顯示6列

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

變化nRowsnColumns相應有多少列和所需的行,即如果你想要一個20x20遊戲,你會用,this.setLayout(new GridLayout(20, 20));