Добавление JButton по циклу приводит к увеличению размера последней кнопки

#java #loops #button

#java #циклы #кнопка

Вопрос:

Когда я создаю кнопку с помощью цикла, последняя кнопка имеет размер всего фрейма. Как я могу это исправить?

 package test;

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

public class test{

private JFrame frame;
private static JButton[][] buttons  = new JButton[4][4];

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                test window = new test();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

public test() {
    initialize();
}

private void initialize() {
    frame = new JFrame();
    frame.setBounds(200, 200, 600, 600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    for(int i=0; i < 4; i  ){
        for(int j=0; j < 4; j  ){
            JButton btn = new JButton(""   i j);
            btn.setBounds(60*i,60*j,60,60);
            if((i j)%2==1)
            btn.setBackground(Color.BLACK);
            buttons[i][j]  = btn;
            frame.add(btn);
        }
    }

}
  }
 

Ответ №1:

  1. Не используйте setBounds(…) для кнопок. Определение размера / местоположения компонента является задачей менеджера компоновки. Менеджер компоновки по умолчанию для JFrame — это BorderLayout . Только один компонент может быть добавлен в ЦЕНТР BorderLayout, поэтому BorderLayout управляет только размером / расположением последней добавленной кнопки, а остальные кнопки игнорируются.
  2. Используйте другой менеджер компоновки. Я подозреваю, что вы должны использовать GridLayout . Прочитайте раздел из руководства Swing по использованию менеджеров компоновки для получения дополнительной информации и рабочих примеров.
  3. Также не используйте setBounds для фрейма. После добавления кнопок во фрейм и перед вызовом setVisible(..) вы должны использовать frame.pack(), чтобы кнопки отображались в их предпочтительном размере.

Ответ №2:

Похоже, это хорошее применение для менеджера компоновки пакетов сетки. Попробуйте что-то вроде этого:

Сначала вам нужно импортировать класс GridBagConstraints.

 import java.awt.GridBagConstraints;
 

А затем просто внесите эти изменения в свои циклы for .

 for(int i=0; i < 4; i  ){
    for(int j=0; j < 4; j  ){
        JButton btn = new JButton(""   i j);
        //btn.setBounds(60*i,60*j,60,60);
        if((i j)%2==1)
        btn.setBackground(Color.BLACK);
        buttons[i][j]  = btn;
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = i;
        gbc.gridy = j;
        frame.add(btn, gbc);
    }
}
 

Менеджер компоновки пакетов сетки довольно сложен, но как только вы поймете, как он работает, он действительно полезен. Вы можете ознакомиться с этим руководством по Oracle для получения дополнительной информации.

Надеюсь, это поможет.