2012-02-28 88 views
4

我是用Java編程的,而且還是比較新的。嘗試使用GUI基礎知識,我決定製作一個棋盤,所有64個單元都是JButton的實例,背景填充。可悲的是,當我試圖編譯代碼時,只有兩個按鈕出現,並且它們都沒有着色。我試圖理解這個問題,但現在看起來有點超出我了。用於輸出棋盤按鈕的GridLayout

package checkerboard; 

import java.awt.Color; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import javax.swing.*; 

public class Checkerboard extends JFrame { 

public Checkerboard() { 

    JButton black = new JButton("B"); 
    JButton white = new JButton("W"); 

      black.setBackground(Color.BLACK); 
      white.setBackground(Color.WHITE); 



    JPanel p1 = new JPanel(); 
    p1.setLayout(new GridLayout(8, 8)); 
    p1.setSize(600, 600); 

    for (int i = 0; i < 8; i++) { 
     if (i % 2 == 0) { 
      for (int j = 0; j < 4; j++) { 
       p1.add(black); 
       p1.add(white); 
      } 
     } else { 
      for (int j = 0; j < 4; j++) { 
       p1.add(white); 
       p1.add(black); 
      } 
     } 
    } 
    super.add(p1); 
} 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 

    Checkerboard frame = new Checkerboard(); 
    frame.setTitle("Checkers"); 
    frame.setSize(600, 600); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 

    } 
} 

在試驗JPanel時,出於一些奇怪的原因,第27行有一個NullPointer異常。

+0

這是一個家庭作業嗎? – 2012-02-28 16:39:26

+0

@Alex請參閱我的修改回答 – 2012-02-28 17:00:27

+0

也考慮一個對比的前景色。 – trashgod 2012-02-28 19:32:01

回答

4

這是因爲您只使用JButton的一個實例對象作爲黑色按鈕,並且僅將JButton的一個實例對象用作白色按鈕,並且您將越來越多地向JPanel p1添加相同的2個引用。因此,這不起作用,您需要爲電路板上的每個按鈕創建一個對象。這裏是你如何能做到這樣的事:

enter image description here

JButton[] blackButtons = new JButton[4 * 8]; 
JButton[] whiteButtons = new JButton[4 * 8]; 

for(int i = 0; i < blackButtons.length; i++) 
{ 
    blackButtons[i] = new JButton("B"); 
    blackButtons[i].setBackground(Color.BLACK); 
} 
for(int i = 0; i < whiteButtons.length; i++) 
{ 
    whiteButtons[i] = new JButton("W"); 
    whiteButtons[i].setBackground(Color.WHITE); 
} 

,那麼你可以將它們添加這樣的:

for (int i = 0; i < 8; i++) { 
    if (i % 2 == 0) { 
     for (int j = 0; j < 4; j++) { 
      p1.add(blackButtons[4 * i + j]); 
      p1.add(whiteButtons[4 * i + j]); 
     } 
    } else { 
     for (int j = 0; j < 4; j++) { 
      p1.add(whiteButtons[4 * i + j]); 
      p1.add(blackButtons[4 * i + j]); 
     } 
    } 
} 

add(p1); 
+0

太棒了!我從宿舍的同學那裏得到了類似的建議,但仍然存在一個奇怪的問題,那就是setBackground(Color color)實際上並不影響按鈕的顏色。我用setForeground試過了,但是它改變了字體顏色。我正在使用MacOSX,那會是一個問題嗎? – Alex 2012-02-28 21:18:43

2

的問題是,黑色和白色的JButton對象,你可以」不止一次將相同的對象添加到JPanel。

您需要在每次添加時創建一個新的JButton。你可以在循環中實例化它們。

for (int i = 0; i < 8; i++) { 
    if (i % 2 == 0) { 
     for (int j = 0; j < 4; j++) { 
      p1.add(newButton("B", Color.Black)); 
      p1.add(newButton("W", Color.White)); 
     } 
    } else { 
     for (int j = 0; j < 4; j++) { 
      p1.add(newButton("W", Color.White)); 
      p1.add(newButton("B", Color.Black)); 
     } 
    } 
} 

只需添加一個方法來做到這一點。

private newButton(String label, Color background) { 
    JButton button = new JButton(label); 
    button.setBackground(background); 
    return button; 
}