2012-04-21 18 views
1

Swingで遊んで、GridLayoutが10行10列として定義されているときに、次のコードが3つの列を持つように見える理由を疑問に思っていますか?Java - 珍しいGridLayoutの振る舞い

誰でもこの異常な動作について説明し、提供されているコードでこれが起こる原因は何ですか?

public class MyGrid { 

    public static void main (String[] args) { 
     JFrame frame = new JFrame(); 
     Container container = frame.getContentPane(); 
     container.setLayout(new GridLayout(10,10)); 
     for (int i = 0; i < 5; i++) { 
      for (int j = 0; j < 5; j++) { 
       if (i>=j) { 
        container.add(new JButton("X")); 
       } else { 
        container.add(new JLabel("Y")); 
       } 
      } 
     } 
     frame.setSize(500,500); 
     frame.setVisible(true); 
    } 

} 

答えて

4

GridLayoutのクラスのJavadocを参照してください:

行の数と列の数の両方が、コンストラクタによって、またはsetRowsとsetColumns方法のいずれかによって、非ゼロ値に設定されている場合、指定された列の数は無視されます。代わりに、列の数は、指定された行数とレイアウト内のコンポーネントの総数から決定されます。たとえば、3行2列が指定され、9つのコンポーネントがレイアウトに追加された場合、3行3列として表示されます。列数を指定すると、行数がゼロに設定されている場合にのみレイアウトに影響します。

あなたはこのコード

public class MyGrid { 

    public static void main (String[] args) { 
    JFrame frame = new JFrame(); 
    Container container = frame.getContentPane(); 
    container.setLayout(new GridLayout(10,10)); 
    for (int i =0; i < 100; i++){ 
     container.add(new JLabel(""+i)); 
    } 
    frame.setSize(500,500); 
    frame.setVisible(true); 
    } 

} 

を使用している場合は、10行10列を見るでしょう。たとえばforループでi < 50を使用すると、列の数が変化します。

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

public class MyGrid { 

    public static void main (String[] args) { 
     JFrame frame = new JFrame(); 
     Container container = frame.getContentPane(); 
     container.setPreferredSize(new Dimension(500,500)); 
     container.setLayout(new GridLayout(10,10)); 
     for (int i = 0; i < 10; i++) { 
      for (int j = 0; j < 10; j++) { 
       if (i>=j) { 
        container.add(new JButton("X")); 
       } else { 
        container.add(new JLabel("Y")); 
       } 
      } 
     } 
     //frame.setSize(500,500); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

} 

元のコードは、それが奇妙に見えることを期待100のために設計された容器内で25個の成分を入れました。

+0

1)GUIの構築/更新はEDTで行う必要があります。 BNI。 2)そのコードはコンテナに好ましいサイズを設定し、ボタン/ラベルインスタンスを「正方形」にする必要があります。 –