2010-05-11 123 views
2

我正在通過Java書中的JPanel練習。我的任務是使用GridLayout創建一個5x4網格。java嵌套for()循環拋出ArrayIndexOutOfBoundsException

當我通過容器循環添加面板和按鈕時,第一個add()會引發OOB異常。我究竟做錯了什麼?

package mineField; 

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

@SuppressWarnings("serial") 

public class MineField extends JFrame { 

private final int WIDTH = 250; 
private final int HEIGHT = 120; 
private final int MAX_ROWS = 5; 
private final int MAX_COLUMNS = 4; 

public MineField() { 

    super("Minefield"); 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    Container mineFieldGrid = getContentPane(); 
    mineFieldGrid.setLayout(new GridLayout(MAX_ROWS, MAX_COLUMNS)); 

    // loop through arrays, add panels, then add buttons to panels. 
    for (int i = 0; i < MAX_ROWS; i++) { 
     JPanel[] rows = new JPanel[i]; 

     mineFieldGrid.add(rows[i], rows[i].getName()); 
     rows[i].setBackground(Color.blue); 

     for (int j = 0; j < MAX_COLUMNS; j++) { 
      JButton[] buttons = new JButton[i];    
      rows[i].add(buttons[j], buttons[j].getName()); 
     } 
    } 

    mineFieldGrid.setSize(WIDTH, HEIGHT); 
    mineFieldGrid.setVisible(true); 

} 

public int setRandomBomb(Container con) 
{ 

    int bombID; 

    bombID = (int) (Math.random() * con.getComponentCount()); 
    return bombID; 


} 
/** 
* @param args 
*/ 
public static void main(String[] args) { 

    //int randomBomb; 
    //JButton bombLocation; 

    MineField minePanel = new MineField(); 
    //minePanel[randomBomb] = minePanel.setRandomBomb(minePanel); 

} 

}

我敢肯定,我在工程一個簡單的嵌套for循環。由於我是Java新手,請善待。我相信有一天我會回來的。

回答

2

JPanel[] rows = new JPanel[i];

i是0在第一次迭代,這是不是你想要的。作出這樣的:

JPanel[] rows = new JPanel[MAX_ROWS];

另外,我覺得你要採取完全for外循環,因爲你似乎可以用它的元素,這將是未初始化...

這也是錯誤:

JButton[] buttons = new JButton[i];

i可以是0時j爲2,例如,在這種情況下,沒有這樣的東西作爲一個buttons[j]。讓它們全部爲MAX_*,我想你想把它們從循環中拿出來,因爲我沒有看到在每次迭代中重新創建它們的意義。此外,您還需要實例化單個數組元素。

+0

好的,所以我分配了JPanel []數組w/MAX_ROWS。我如何初始化JPanel數組和什麼值? – 2010-05-11 21:32:31

+0

對於在0和'MAX_ROWS-1'之間的每個'k',JPanel [k] = new JPanel()。 – IVlad 2010-05-11 21:43:51

+0

忽略最後一個。 因此JPanel [] rows = new JPanel [MAX_ROWS]聲明併爲我的數組分配內存。現在,我如何使用JPanel對象初始化數組?我假設我然後分配JButtons行[i] .add(),對吧? – 2010-05-11 21:47:16

2

這部分並沒有真正意義:

for (int j = 0; j < MAX_COLUMNS; j++) { 
     JButton[] buttons = new JButton[i]; 
     rows[i].add(buttons[j], buttons[j].getName()); 
    } 

你正在創建的i Jbutton將數組,並嘗試添加j日至rows,這沒有什麼意義,如果將無法正常工作j >= i。你可能的意思是:

JButton[] buttons = new JButton[MAX_COLUMNS]; 
    for (int j = 0; j < MAX_COLUMNS; j++) { 
     rows[i].add(buttons[j], buttons[j].getName()); 
    } 

但數組仍然不包含任何按鈕,你所做的就是初始化它。根本沒有理由爲陣列;這實際上工作:

for (int j = 0; j < MAX_COLUMNS; j++) { 
     JButton button = new JButton("foo"); 
     rows[i].add(button, button.getName()); 
    } 
0

問題是,你的按鈕陣列的大小我,但j可以比我大。例如,第一次通過,你這是一個空數組這裏:

JButton[] buttons = new JButton[i]; 

,因爲我是等於0。然後,您嘗試在索引0來訪問它,它不存在(因爲數組沒有大小),你會得到你的例外。你應該做的是:

JButton[] buttons = new JButton[MAX_COLUMNS]; 

這樣,你將有一個按鈕爲每個陣列的位置。此外,您可能需要初始化各個按鈕 - 即是這樣的:

for (int k = 0; k < MAX_COLUMNS; k++) { 
    buttons[k] = new JButton(); 
} 

(免責聲明:代碼沒有測試,但是掏出你知道是哪裏只是爲了舉例說明有可能是拼寫錯誤或。看不見的bug)

祝你好運。

1
JPanel[] rows = new JPanel[i]; 

當我是0時,您將創建一個包含0個元素的數組。然後嘗試訪問該數組,但它沒有任何元素。

0

看起來你創建的方式太多了。你在循環中創建數組,所以不是創建5行,而是創建5行5行或25行。

另一個問題是,你實際上沒有創建任何對象,只有數組來保存對象。對於數組中的每個對象,都需要另一個「button [j] = new JButton()」行。