1

只是在玩 Swing,想知道为什么当 GridLayout 定义为 10 行和 10 列时,下面的代码构造了一个似乎有 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 < 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

2 回答 2

4

请参阅类 javadoc GridLayout

当行数和列数都已通过构造函数或 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 列。例如,如果i < 50在 for 循环中使用,列数会发生变化。

于 2012-04-21T11:53:00.030 回答
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 个设计的容器中。预计它看起来很奇怪。

于 2012-04-21T11:52:51.243 回答