Ну, это может быть ужасной работой без менеджера по раскладке, но если вы хотите этого ... вот и мы.
- Добавьте
ComponentListener
к вашему кадру, чтобы прослушать его изменение размера, где вы можете получить размер окон после изменения размера.
Как:
frame.addComponentListener(new ComponentListener() {
@Override
public void componentShown(ComponentEvent e) {
}
@Override
public void componentResized(ComponentEvent e) {
if (e.getSource() instanceof JFrame) {
JFrame frame = (JFrame)(e.getSource());
frame.repaintElements(frame.getWidth(), frame.getHeight());
}
}
@Override
public void componentMoved(ComponentEvent e) {
}
@Override
public void componentHidden(ComponentEvent e) {
}
});
В вашем JFrame
классе (в этом случае вы должны сделать его дочерним классом JFrame
, чтобы добавить свой собственный метод), определите метод repaintElements(int w, int h)
, взяв в качестве аргументов новую высоту и новую ширину .
В repaintElements(int x, int y)
реализуйте свою логику, чтобы изменить местоположение и размер каждого элемента. Я использую setBound(int x, int y, int w, int h)
. x
и y
определяют местоположение левого верхнего угла элемента относительно его контейнера, а w
и h
определяют его размер.
В конце концов, я заставил его работать в моем проекте, но это все утомительно. Подумайте об этом:
У меня есть длинный ярлык сверху, затем таблица внизу, а затем еще одна панель под столом, наконец, кнопка выхода в правом нижнем углу.
Прежде всего, заголовок надписи. Я хочу, чтобы он расширялся по горизонтали, но не по вертикали, поэтому в моем repaintElements()
я установил его следующим образом:
label1.setBounds(5, 0, x-5, 30);
так что каждый раз, когда окна изменяют размер, метка располагается на 5 пикселей с самого левого края, 0 пикселей с самого верха, x-5
пикселей с шириной (чтобы оставить место для границы) и всегда на 30 пикселей высоты.
Теперь у меня есть JScrollPane
, содержащий JTable
. Я хочу, чтобы он расширялся вместе с окном, поэтому:
table.setBounds(5, 30, x-15, y-30-60-5);
Поскольку по вертикали я должен оставить место для надписи выше (30 пикселей) и панели внизу (60 пикселей) и кнопки внизу (5 пикселей), а расположение этой таблицы определяется высотой и шириной надписи выше (5 и 30, если без границ ...). На столе есть вертикальная прокрутка, поэтому я тоже должен оставить для нее место (так что x-15
вместо x-5
. Святое дерьмо.)
А потом еще одна панель ниже. Если окно расширяется, по горизонтали я хочу, чтобы эта панель тоже увеличивалась, но не по вертикали, поэтому:
panel.setBounds(5, y-30-60-5+30, x-10, 60); //the y value is "y coordinate of the element above" + "width of the element above"
Наконец, кнопка. Я решил не увеличивать его размер, а просто оставить его в углу, поэтому:
button.setBounds(x-20, y-10, 15, 5); //the button is 15*5 pixels. extra space is for border.
Легко? Вроде бы так, но вам нужно много тестировать ........ И если размер границы изменится, еще один адский тест ... На самом деле вы тратите время на некоторые тривиальные вещи и вскоре вам становится скучно. Итак, воспользуйтесь менеджером макетов.