2011-06-28 107 views
3

我的程序中有3個類。Java佈局問題

public class Field extends JLabel{ 

    private int x, y; 

    public Field(int x, int y){ 
     this.x = x; 
     this.y = y; 
     setOpaque(true); 
     setMinimumSize(new Dimension(50,50)); 
     setPreferredSize(new Dimension(75,75)); 
     if((x + y) % 2 == 0) 
      setBackground(Color.GREEN); 
     else 
      setBackground(Color.YELLOW); 
    } 


public class Board extends JPanel{ 

    public Field[][] fields = new Field[8][8]; 

    public Board(){ 
     setLayout(new GridLayout(8,8)); 
     setMinimumSize(new Dimension(500,500)); 
     setPreferredSize(new Dimension(550,550)); 
     setBackground(Color.RED); 
     fillBoard(); 
    } 

    private void fillBoard(){ 
     for(int i = 0; i < 8; ++i){ 
      for(int j = 0; j < 8; ++j){ 
       fields[i][j] = new Field(i, j); 
       add(fields[i][j]); 
      } 
     } 
    } 

public class GUI extends JFrame{ 

    public Board board; 

    private GUI(){ 
     board = new Board(); 
     setLayout(new FlowLayout()); 
     add(board); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setVisible(true); 
     pack(); 
    } 

    public static void main(String[] args){ 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() { 
       new GUI(); 
      } 
     }); 
    } 

} 

每當我運行該程序,this出現,而不是一個黃綠色的電路板。任何人都可以幫忙嗎?

+0

你能更詳細地描述你所期望它看起來像? – mgiuca

+4

當我運行你的代碼時,我得到一個綠色/黃色的棋盤,在右側和底部都有一個紅色的小邊框。 –

+0

大概只是一個錯字,但'Field'類沒有關閉 – barrowc

回答

3

您發佈的代碼無法編譯。重新嵌入到嵌套類使它正確工作 所示,所以我猜你有一個項目級別的問題。

enter image description here

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class GUI extends JFrame { 

    private Board board; 

    private GUI() { 
     board = new Board(); 
     setLayout(new FlowLayout()); 
     add(board); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setVisible(true); 
     pack(); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new GUI(); 
      } 
     }); 
    } 

    class Board extends JPanel { 

     public Field[][] fields = new Field[8][8]; 

     public Board() { 
      setLayout(new GridLayout(8, 8)); 
      setMinimumSize(new Dimension(500, 500)); 
      setPreferredSize(new Dimension(550, 550)); 
      setBackground(Color.RED); 
      fillBoard(); 
     } 

     private void fillBoard() { 
      for (int i = 0; i < 8; ++i) { 
       for (int j = 0; j < 8; ++j) { 
        fields[i][j] = new Field(i, j); 
        add(fields[i][j]); 
       } 
      } 
     } 
    } 

    class Field extends JLabel { 

     private int x, y; 

     public Field(int x, int y) { 
      this.x = x; 
      this.y = y; 
      setOpaque(true); 
      setMinimumSize(new Dimension(50, 50)); 
      setPreferredSize(new Dimension(75, 75)); 
      if ((x + y) % 2 == 0) { 
       setBackground(Color.GREEN); 
      } else { 
       setBackground(Color.YELLOW); 
      } 
     } 
    } 
} 
+0

僅供參考,這實際上只是@Hovercraft Full Of Eels的見解。 – trashgod

+0

最適合2D圖形+1 – mKorbel

+0

謝謝,這個解決了我的問題。 –

-1

您應該設置佈局管理器,並添加組件到contentPane上的JFrame,裏面GUI你應該叫:

getContentPane().setLayout(new FlowLayout()); 
getContentPane().add(board); 

你的代碼編譯,如果董事會和現場都被重構內部類,但結果看起來像這 Result

爲了讓界面看起來不會對您的主板構造紅線評論setPreferredSize(new Dimension(550,550));所以它變成了:

public Board(){ 
     int rows = 8,cols = 8; 
    setLayout(new GridLayout(rows,cols)); 
    setMinimumSize(new Dimension(500,500)); 
    //setPreferredSize(new Dimension(550,550)); 
    setBackground(Color.RED); 
    fillBoard(); 
} 

The result after removing setPreferredSize()

+2

直接在JFrame上調用這些方法(就像OP所做的那樣)只是委託給內容窗格,這應該沒有什麼區別。 –

+0

他沒有提到他正在使用的jdk的版本,所以我的回答本身並不是真的錯誤 –

+0

我沒有倒下,但你絕對是對的。看起來這種行爲是從Java 5開始添加(或者至少有文檔)的。但是我希望OP不使用過時的Java版本。 –