clientFrame.getContentPane().add(client_panel, "Center");
Не используйте магические значения.Люди не знают, откуда появляется «Центр».Используйте переменные, предоставляемые API:
clientFrame.getContentPane().add(client_panel, BorderLayout.CENTER);
То, что вы спрашиваете, невозможно с любым известным мне менеджером макета.Проблема в том, что диспетчер макетов знает только о размере, доступном для компонента.Он не знает, почему размер изменился (т. Е. Перетащите вверх или вниз).Таким образом, менеджер компоновки может определять правила только на основе доступного пространства.
В качестве простого теста используйте JPanel
с BorderLayout
.Затем создайте JLabel
, содержащий ImageIcon
.Добавьте метку на эту панель, а затем добавьте панель на панель содержимого фрейма.
Если вы добавите метку в BorderLayout.CENTER, тогда изображение будет отцентрировано в доступном пространстве, и вы потеряете частьверх и низ.
Если вы добавите метку в BorderLayout.PAGE_START, тогда всегда будет взят пробел (или дан) нижней части компонента.
Если вы добавите метку вBorderLayout.PAGE_END, тогда пробел всегда берется (или задается) сверху компонента.
Если вы хотите учесть перетаскивание кадра вверх или вниз, тогда решение становится намного сложнее, потому что вы будетенеобходимо добавить ComponentListener
к кадру и обработать методы componentResized
и componentMoved
.Затем вам нужно будет отслеживать предыдущее состояние фрейма, а затем определить, какие свойства были изменены, а затем вам нужно будет выполнить пользовательское рисование изображения на основе изменений свойств, или вам нужно будет написать собственный менеджер макета, который знает освойство меняется.