2012-04-21 5 views
1

Просто играйте с Swing и задаетесь вопросом, почему следующий код создает макет, который, кажется, имеет три столбца, когда GridLayout определяется как 10 строк и 10 столбцов?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

См класса 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, количество столбцов изменяется.

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. Expect, чтобы это выглядело странно.

+0

1) Конструкция/обновление GUI должно выполняться на EDT. BNI. 2) Этот код задает предпочтительный размер контейнера, который должен сделать квадрат кнопки/метки. –

Смежные вопросы