Еще раз, не играйте с размером. Все компоненты Swing должны определять свой собственный предпочтительный размер. Это включает в себя панели и рамы.
Размер панели будет определяться на основе компонента, добавленного на панель.
Рамка будет определять ее размер на основе панелей, добавленных в рамку. После добавления панелей вы используете метод pack ().
Тогда все компоненты будут отображаться в их предпочтительном размере. Затем вы можете просто сделать кадр фиксированного размера, используя:
frame.setResizable( false );
Однако, если вы не сделаете вышеизложенное, вам нужно определить, что произойдет, если размер кадра будет изменен. Затем вам нужно быть более внимательным к менеджерам компоновки, которые вы используете.
Для GridLayout
размеры всех компонентов изменяются, чтобы заполнить все доступное пространство. Это легко проверить, изменив код рисования в GraphicsTile` на:
//g.fillRect(0, 0, 140, 140);
g.fillRect(0, 0, getWidth(), getHeight());
Это лучшая техника рисования. Вы не должны быть жесткими значениями. Используйте свойства компонента, чтобы при необходимости указать параметры.
Если вы сделаете это, вы увидите, что плитки расширяются, чтобы заполнить область, и CirclePanel
находится в начале GraphicsTile (опять же, потому что вы жестко закодировали местоположение).
Чтобы не допустить увеличения размера GraphicsTile, вам нужно будет обернуть его в другую панель, которая учитывает предпочтительный размер добавляемых к нему компонентов.
Простой способ сделать это - использовать GridBagLayout
со значением по умолчанию GridBagConstraints
. Теперь любой компонент, добавленный к нему, будет центрирован в доступном пространстве.
Таким образом, реструктуризация вашего метода main () будет выглядеть так:
JFrame frame = new JFrame();
frame.setLayout(new GridBagLayout());
JPanel tilePanel = new JPanel( new GridLayout(0, 1, 5, 5) );
tilePanel.add(new GraphicsTile());
tilePanel.add(new GraphicsTile());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(tilePanel, new GridBagConstraints());
frame.pack();
frame.setVisible(true);