public void renderPanels(){
for(int i = 1; i<4; i++){
for(int j = 1; j<4; j++){
panels[i][j] = new JPanel();
frame.add(panels[i][j]);
buttons[i][j] = new JButton();
panels[i][j].add(buttons[i][j]);
panels[i][j].setBounds(i*50, j*50, 50, 50);
panels[i][j].setLayout(null);
buttons[i][j].setBounds(0, 0, 50, 50);
System.out.println(panels[i][j].getBounds());
}
}
}
Хорошо, так что это мой код для рендеринга сетки 3х3 с кнопками внутри них. переменная frame содержит объект JFrame
но, к сожалению, мой вывод похож на следующий снимок экрана:
кадр в последней итерации представляется в месте, как если бы я и j находились на 1 единицу ниже начальных значений. Есть идеи?
используйте GridLayout вместо setBounds()
, не используйте NullLayout
вообще
frame.add(panels[i][j]);
должна быть последняя строка кода в цикле
System.out.println(panels[i][j].getBounds());
возвращает разумные координаты после JFrame.pack()
или JFrame
уже visible
на экране
для лучшей помощи скорее опубликуйте SSCCE/MCVE, короткий, управляемый, компилируемый
Это происходит потому, что макет по умолчанию JFrame
не равен null
. Это BorderLayout
. Если вы действительно хотите установить границы, сделайте макет JFrame
null
.
frame.setLayout(null);
** Хотя можно обойтись без менеджера макетов, вы должны использовать диспетчер компоновки, если это вообще возможно. Менеджер компоновки упрощает настройку на внешний вид компонентов, зависящих от внешнего вида, разных размеров шрифтов, размера контейнера и разных локалей. Менеджеры макетов также могут быть легко использованы другими контейнерами, а также другими программами.
Хотя, GridLayout - это путь. Вот некоторые вещи, которые вам могут потребоваться.
Вот некоторые основные из GridLayout
JPanel m = new JPanel();
GridLayout gridLayout = new GridLayout(3, 3,0,0);
m.setLayout( gridLayout);
for (int i = 0; i < gridLayout.getRows(); i++) {
for (int ii = 0; ii < gridLayout.getColumns(); ii++) {
JPanel p = new JPanel();
p.add(new JButton("X"));
m.add(p, i, ii);
}
}
frame.add(m);
null
макет в этом контексте.
setBounds
.