По сути, вы должны понять, какая часть головоломки отвечает за то, что
устанавливает границу для контейнера (здесь levelPanel) добавляет пространство-требованиек самому контейнеру (как уже объяснил @Boro): LayoutManager, применяемый к этому контейнеру, будет размещать дочерние элементы контейнера только внутри вставок, как того требует граница.Это то, что вы видите в levelPanel, красный над первой кнопкой, под последней кнопкой (по бокам от всех кнопок)
установка свойств разрыва x / y в LayoutManager, которыйподдерживать это, имеет эффекты, которые полностью решаются самим менеджером, и никак не могут прочитать приложение конкретного менеджера.
Документ API для GridLayout:
* In addition, the horizontal and vertical gaps are set to the
* specified values. Horizontal gaps are placed between each
* of the columns. Vertical gaps are placed between each of
* the rows.
Документ API для FlowLayout:
* @param hgap the horizontal gap between components
* and between the components and the
* borders of the <code>Container</code>
* @param vgap the vertical gap between components
* and between the components and the
* borders of the <code>Container</code>
Исходя из вашего кода, вы ожидаете достичьGridLayout будет иметь такое же поведение гэпа, что и FlowLayout: -)
Поскольку LayoutManager родительского уровня levelPanel (parent == mainP) - FlowLayout, вы можете - в качестве альтернативы для установки Border в mainP- установить разрыв FlowLayout:
mainP.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 50));