FlowLayout
просто размещает один компонент рядом с другим в порядке слева направо. Когда ширина достигает одного из контейнеров с таким макетом, он просто переносится на другую строку.
Если вы хотите расположить их в виде сетки (как вам кажется), вы можете использовать GridLayout
, который позволяет вам указать количество столбцов и строк:
component.setLayout(new GridLayout(2,2))
Единственный недостаток GridLayout
состоит в том, что каждая ячейка сетки будет иметь одинаковый размер (что обычно хорошо, если у вас просто есть JButtons
или JLabels
, но когда вы смешиваете вещи, это будет визуально плохо) .
Если вам действительно нужно больше энергии, используйте GridBagLayout
, очень настраиваемый, но с более крутой кривой обучения в начале.
Возможно, ваша проблема с размером связана с тем, что вы используете setSize
, но в Swing эти вещи ведут себя странно, вам следует попробовать установить setPreferredSize(200,200)
вместо setSize
. Но не спрашивайте меня, почему!
ПРИМЕЧАНИЕ : Вы должны ВСЕГДА ссылаться на панель содержимого фрейма, а не на сам фрейм. Когда вы устанавливаете макет, вы должны сделать getContentPane().setLayout(..)
, когда вы добавляете элементы, вы должны сделать getContentPane().add(..)
и т. Д.
Ошибки: теперь каждые JFrame
add
, remove
, setLayout
автоматически пересылаются на панель содержимого.