| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: GUI и Java FX приложения > Какой менеджер компоновки выбрать?.. |
| Автор: GZep 29.8.2011, 14:00 | ||
| Здравствуйте. Вот такой результат хочу получить: (выделите картинку, чтобы не сливалась с фонов и было видно, что снизу отступ) http://imageshack.us/photo/my-images/3/94292769.png/ То есть чтобы элементы горизтально выравнивались по правому, левому краю или по центру, а вертикально всегда выравнивались к "потолку". В принципе GridBagLayout справляется, но проблема в том, что элементы появляются динамически и точное число не известно. Вот такой код работает как надо, но если добавим следующий элемент, то вертикальное выравнивание сломается.
Вопрос: может как-то можно научить GridBagLayout выравнивать всегда наверх или проще написать простенький свой менеджер? |
| Автор: CHEM_Eugene 29.8.2011, 14:23 |
| Возьми http://download.oracle.com/javase/tutorial/uiswing/layout/box.html См. там примеры, как раз то, что тебе нужно, по-моему |
| Автор: GZep 29.8.2011, 14:38 |
| CHEM_Eugene, BoxLayout не подошел, он постоянно все к центральной линии притягивает. Лечится только манипуляциями с размерами и то не всегда. В общем долго с ним возился - не победил. |
| Автор: AntonSaburov 29.8.2011, 16:17 |
| Напишите свой вариант Layout'а - чтобы делал то, что надо. Вот статейка - http://java-course.ru/articles/articles.php?name=LayoutManager Там в конце есть вариант. |
| Автор: GZep 29.8.2011, 16:33 |
| Спасибо большое, такую статью хорошую увы сам не нашел. Вечером попробую. Один вопрос: поскольку мне надо разные варианты горизонтальной ориентации - придется реализовывать LayoutManager2? Или LayoutManager тоже подойдет? |
| Автор: COVD 29.8.2011, 17:10 |
| Вовсе необязательно пытаться сделать все одним лэйаутом на одной панели. В этом случае обычно возникает необходимость виртуозного владения сложным лэйаутом типа GridBagLayout или написания собственного. Другой подход - использовать вложенные панели с простыми стандартными лэйаутами. В данном примере можно создать пустые панели и сначала решить задачу их вертикального размещения. Потом внутри каждой панели решать задачу горизонтального размещения. |
| Автор: GZep 30.8.2011, 13:11 | ||||||
| Как оказалось, написать свой менеджер достаточно просто особенно учитывая то, что настроек у этого самого менеджера по минимуму. Отдельная благодарность AntonSaburov за статью, где все так хорошо написано. Сам отвечу на свой вопрос:
LayoutManager тоже подходит, потому что мы можем узнать вариант горизонтальной ориентации из component.getAlignmentX(). Сам менеджер:
Как работает:
P.S. по-дурацки сделали: component.getAlignmentX() возвращает тип Float и его нельзя использовать в конструкции switch-case... |
| Автор: Skipy 30.8.2011, 14:27 |
| И ради этого городить собственный менеджер... Все элементы кроме последнего кладутся в панель. У всех weighty=0. Панель добавляется в основной контейнер с weighty=0, последний элемент - с weighty=1. При добавлении элемента последний из ранее добавленных переносится в панель, новый на его место. |
| Автор: GZep 30.8.2011, 22:01 | ||
Кстати, менеджер получился ИМХО куда менее громоздкий чем стандартные. Skipy, можно пример? Я так понимаю, вы имеете ввиду GridBagLayout? Почитайте топик. Я пытался найти решение стандартными менеджерами, но увы не смог сам и мне не помогли.
Вот не совсем понял, в принципе все в это и упиралось, что элементы добавляются динамически. |
| Автор: CHEM_Eugene 31.8.2011, 09:30 |
| метод setAlignmentX позволяет удивительным образом проделать тоже самое с BoxLayout, не заморачиваясь на собственных реализациях |
| Автор: Skipy 31.8.2011, 10:29 | ||||||
Ну да, ступил. Ничего никуда не надо переносить, стандартными делается.
|
| Автор: GZep 31.8.2011, 13:26 |
| Skipy, спасибо понял вашу связку 2 менеджеров. Итого 2 работающих варианта. Какой выбрать? Если использовать новый менеджер, который точно заточен под конкретную задачу, то из минусов получаем только необходимость использовать еще один класс. При варианте со связкой 2-х менеджеров имеем свои минусы (постараюсь объективно):
В принципе думаю тему раскрыли полностью, лично сам пока думаю остановиться на варианте с использование своего менеджера, хотя, может ошибаюсь. |
| Автор: Skipy 31.8.2011, 13:34 |
| 1. Связка менеджеров - это норма. У меня иногда в формах до 10 вложенных контейнеров, и менеджеров, соответственно, 10. И совершенно необязательно одинаковые. 2. И что? Вы о памяти беспокоитесь? Не бойтесь, 10-20 кб погоды не сделают. P.S. Универсальные менеджеры хороши именно тем, что они универсальны. Менеджер, сделанный под конкретную задачу, во-первых, сложно переиспользовать, во-вторых, необходимо поддерживать. Изменились условия - и Вы будете переписывать код. А я в худшем случае поменяю пару параметров. Предлагаю подумать, что Вам надо изменить, чтобы элементы были прижаты не к верху, а к низу, в том же порядке. И что надо изменить мне (один параметр в одном методе). |
| Автор: GZep 31.8.2011, 19:23 | ||||||||
Тут наверное субъективно больше... но, например, в HTML не приветствуется глубокая вложенность. Вижу тут аналогию.
Но ведь этот минус не засчитывается. К нему просто таких требований нету.
Вот резонный аргумент! Действительно, кастомизация переезжает на уровень редактирования кода самого менеджера - это плохо.
Согласен. А вот еще один плюс нарисовался для собственного варианта - код инициализации. Вот он (продублирую, он был выше):
Согласитесь, тут код выглядит гораздо лучше чем тот же GridBagLayout + GridBagConstraints, не говоря уже о слое с BorderLayout. Честно говоря больше всего нравится как реализована компановка в https://github.com/jacek99/javabuilders (используется Yaml разметка). |
| Автор: COVD 31.8.2011, 19:37 | ||
Вложенность трудна для восприятия, если код руками писать ( тут почти все поклонники такого способа ). Если пользоваться дизайнером, то все наглядно. Для ГУИ, сделанного в дизайнере - это нормальный подход. Я выше об этом писал - пользоваться набором простых лэйаут менеджэров. В HTML наверное аналогично. |
| Автор: GZep 3.9.2011, 22:57 | ||
Кстати. а если условия изменятся таким образом, что стандартные менеджеры опять не справятся без "костылей"? В таком случае будет проще наклепать изменения опять таки в свой кастомный менеджер. Вот подумал, код ведь может кто-нибудь будет использовать у себя, а там баг в методе preferredLayoutSize, из-за чего он вел себя неправильно, если например обернуть компонент в скроллбары... в общем, исправил |