Java - 不寻常的GridLayout行为

时间:2012-04-21 11:40:24

标签: java swing jbutton jlabel grid-layout

只是玩Swing并想知道为什么以下代码构造一个布局,当GridLayout被定义为10行和10列时,它似乎有三列?

任何人都可以解释这种不寻常的行为以及提供的代码中会导致这种情况发生吗?

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);
    }

}

2 个答案:

答案 0 :(得分:4)

请参阅GridLayout的类javadoc:

  

当行数和列数都通过构造函数或setRows和setColumns方法设置为非零值时,将忽略指定的列数。而是根据指定的行数和布局中的组件总数确定列数。因此,例如,如果指定了三行和两列并且将九个组件添加到布局中,则它们将显示为三行三列。仅当行数设置为零时,指定列数才会影响布局。

如果您使用此代码

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,则列数会发生变化。

答案 1 :(得分: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);
    }

}

原始代码将25个组件放入一个专为100设计的容器中。期望它看起来很奇怪。