Можно использовать контейнеры без менеджера компоновки, потому что на самом деле вы МОЖЕТЕ установить компоновку контейнера в NULL. И это хорошая идея позиционировать ваши компоненты с помощью setBounds(). Но в этом случае вам просто нужно рассмотреть свой контейнер. Какого размера он должен быть? Менеджер компоновки рассчитает это для вас, и если у вас его нет, вы должны сами установить размер своей панели в соответствии с компонентами, которые вы добавили в нее.
Как указывали другие здесь, в случае, если менеджеру компоновки границ вашего фрейма нужен предпочтительный размер вашей панели NORTH (фактически, предпочтительная высота). И вы должны установить его, иначе значения будут равны нулю, и контейнер станет невидимым. Обратите внимание, что для ЦЕНТРАЛЬНОЙ панели в этом нет необходимости, так как она занимает все возможное пространство.
У меня была проблема, подобная вашей, и я написал быструю функцию для изменения размера контейнера в соответствии с границами данного компонента. Он будет настолько большим, насколько необходимо, чтобы показать этот компонент, поэтому учитываются размер (w, h) и положение (x, y). Существует версия с автоматическим изменением размера, которую можно использовать один раз после добавления всех компонентов.
public static void updatePreferredSize(Container cont, Component comp) {
int w = cont.getPreferredSize().width;
int h = cont.getPreferredSize().height;
int W = comp.getBounds().x + comp.getBounds().width;
int H = comp.getBounds().y + comp.getBounds().height;
if (W>w||H>h) cont.setPreferredSize(new Dimension(W>w?W:w, H>h?H:h));
}
public static void autoPreferredSize(Container cont) {
for (Component comp : cont.getComponents())
updatePreferredSize(cont, comp);
}
Вы можете использовать updatePreferredSize() после добавления каждого компонента на панель или использовать autoPreferredSize() один раз после всех добавлений.
// [...]
panelN.add(button);
updatePreferredSize(panelN, button);
// [...]
// or...
// [...]
autoPreferredSize(panelN);
// [...]
frame.setVisible(true);
Таким образом, если вы не установите фиксированное значение высоты северной панели, с помощью этих функций вы можете ожидать, что ваша кнопка будет видна в соответствии с положением, которое вы установили с помощью setBounds().
person
PFROLIM
schedule
03.11.2016
JFrame.setDefaultLookAndFeelDecorated(true);
перед созданием графического интерфейса, я надеюсь, что графический интерфейс будет таким же в Linux, Windows и других ОС. Не так ли? - person Dumas45   schedule 19.06.2013