Однако панель кнопок растягивается по всему JFrame.
Правильно. Это правило BorderLayout. Любой компонент, добавленный в CENTER, займет все пространство, доступное в кадре.
И GridLayout также увеличится, чтобы занять все доступное пространство.
Я хочу, чтобы buttonPanel только Занимайте пространство 315x315 в центре.
Не пытайтесь указывать размеры в пикселях. Это не тот способ, которым работает управление компоновкой.
Самый простой способ центрировать компонент в кадре - это использовать GridBagLayout
:
//getContentPane().setLayout(new BorderLayout()); // remove
...
//getContentPane().add(buttonPanel, BorderLayout.CENTER); // remove
setLayout( new GridBagLayout() );
add(buttonPanel, new GridBagConstraints());
Теперь каждая кнопка будет установлена на свою предпочтительный размер и размер панели будет содержать все кнопки.
Если вам нужно дополнительное пространство для кнопок, используйте свойство, например:
button[x].setMargin( new Insets(20, 20, 20, 20) );
Прочитайте учебник Swing на Менеджеры макетов для получения дополнительной информации о каждом менеджере макетов и рабочих примерах.
Редактировать:
для JFrame задан определенный размер c, размер которого не изменяется. , Есть ли способ сделать это с пикселями независимо от
Забудьте о кадре. Это не то, как вы используете Swing. Размер компонентов может быть разным на каждом LAF. Например, используемый шрифт может быть другим. Размер строки заголовка или границы рамки может быть разным. Не пытайтесь установить размер кадра. Вы даете «подсказки» для каждого компонента и позволяете каждому компоненту определять его размер. Тогда вы pack()
рамка и рамка станет размером дочерних компонентов.
Так, например, для кнопок, которые вы можете сделать:
button.setPreferredSize( new Dimension(50, 50) );
Так, если у вас есть 4 кнопки в сетке, размер панели будет (200 x 200).
Если вам нужно дополнительное пространство на панели, вы можете сделать:
panel.setBorder( new EmptyBorder(200, 200, 200, 200) );
, который зарезервирует дополнительное пространство под размер панели, включая кнопки, которые теперь становятся (400 x 400).
Тогда при pack()
размере кадра размер кадра будет (600 x 600) плюс размер строки заголовка и границ.
Прочтите руководство! Также есть раздел на How to Use Borders
.