2011-06-28 80 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版本。 –