#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:
- Не используйте setBounds(…) для кнопок. Определение размера / местоположения компонента является задачей менеджера компоновки. Менеджер компоновки по умолчанию для JFrame — это BorderLayout . Только один компонент может быть добавлен в ЦЕНТР BorderLayout, поэтому BorderLayout управляет только размером / расположением последней добавленной кнопки, а остальные кнопки игнорируются.
- Используйте другой менеджер компоновки. Я подозреваю, что вы должны использовать GridLayout . Прочитайте раздел из руководства Swing по использованию менеджеров компоновки для получения дополнительной информации и рабочих примеров.
- Также не используйте 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 для получения дополнительной информации.
Надеюсь, это поможет.