2011-06-28 7 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つは私の問題を解決しました。 –

-1

あなたはレイアウトマネージャを設定したJFrameのcontentPaneにコンポーネントを追加し、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

これらのメソッドを(OPが行っているように) 'JFrame'に直接呼び出すだけで、内容ペインに委任されますが、これは違いはありません。 –

+0

彼は彼が働いていたjdkのバージョンについては言及していませんでしたので、私の答えは本当に間違っているわけではありません。 –

+0

私はdownvoteしませんでしたが、あなたは絶対に正しいです。この動作がJava 5以降で追加された(または少なくとも文書化されている)ようです。しかし、OPは恐ろしく古いバージョンのJavaを使用していないことを願っています。 –