![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| GZep |
|
|||
![]() участник Винграда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1528 Регистрация: 7.7.2006 Где: Москва Репутация: нет Всего: 32 |
Здравствуйте.
Вот такой результат хочу получить: (выделите картинку, чтобы не сливалась с фонов и было видно, что снизу отступ) ![]() То есть чтобы элементы горизтально выравнивались по правому, левому краю или по центру, а вертикально всегда выравнивались к "потолку". В принципе GridBagLayout справляется, но проблема в том, что элементы появляются динамически и точное число не известно. Вот такой код работает как надо, но если добавим следующий элемент, то вертикальное выравнивание сломается.
Вопрос: может как-то можно научить GridBagLayout выравнивать всегда наверх или проще написать простенький свой менеджер? Это сообщение отредактировал(а) GZep - 29.8.2011, 14:02 -------------------- ![]() ![]() |
|||
|
||||
| CHEM_Eugene |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 12.2.2008 Репутация: нет Всего: нет |
||||
|
||||
| GZep |
|
|||
![]() участник Винграда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1528 Регистрация: 7.7.2006 Где: Москва Репутация: нет Всего: 32 |
CHEM_Eugene, BoxLayout не подошел, он постоянно все к центральной линии притягивает. Лечится только манипуляциями с размерами и то не всегда. В общем долго с ним возился - не победил.
-------------------- ![]() ![]() |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 10 Всего: 118 |
Напишите свой вариант Layout'а - чтобы делал то, что надо. Вот статейка - http://java-course.ru/articles/articles.ph...e=LayoutManager
Там в конце есть вариант. |
|||
|
||||
| GZep |
|
|||
![]() участник Винграда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1528 Регистрация: 7.7.2006 Где: Москва Репутация: нет Всего: 32 |
Спасибо большое, такую статью хорошую увы сам не нашел. Вечером попробую.
Один вопрос: поскольку мне надо разные варианты горизонтальной ориентации - придется реализовывать LayoutManager2? Или LayoutManager тоже подойдет? -------------------- ![]() ![]() |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 4 Всего: 43 |
Вовсе необязательно пытаться сделать все одним лэйаутом на одной панели. В этом случае обычно возникает необходимость виртуозного владения сложным лэйаутом типа GridBagLayout или написания собственного.
Другой подход - использовать вложенные панели с простыми стандартными лэйаутами. В данном примере можно создать пустые панели и сначала решить задачу их вертикального размещения. Потом внутри каждой панели решать задачу горизонтального размещения. |
|||
|
||||
| GZep |
|
|||
![]() участник Винграда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1528 Регистрация: 7.7.2006 Где: Москва Репутация: нет Всего: 32 |
Ну так имхо лучше свой простенький для одной задачи чем: потому что количество элементов неизвестно и второй подход затратен и нелогичен. -------------------- ![]() ![]() |
|||
|
||||
| GZep |
|
||||||
![]() участник Винграда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1528 Регистрация: 7.7.2006 Где: Москва Репутация: нет Всего: 32 |
Как оказалось, написать свой менеджер достаточно просто особенно учитывая то, что настроек у этого самого менеджера по минимуму. Отдельная благодарность AntonSaburov за статью, где все так хорошо написано.
Сам отвечу на свой вопрос:
LayoutManager тоже подходит, потому что мы можем узнать вариант горизонтальной ориентации из component.getAlignmentX(). Сам менеджер:
Как работает:
P.S. по-дурацки сделали: component.getAlignmentX() возвращает тип Float и его нельзя использовать в конструкции switch-case... Это сообщение отредактировал(а) GZep - 3.9.2011, 22:59 -------------------- ![]() ![]() |
||||||
|
|||||||
| Skipy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 487 Регистрация: 24.8.2006 Где: Москва, Россия Репутация: 4 Всего: 16 |
И ради этого городить собственный менеджер...
Все элементы кроме последнего кладутся в панель. У всех weighty=0. Панель добавляется в основной контейнер с weighty=0, последний элемент - с weighty=1. При добавлении элемента последний из ранее добавленных переносится в панель, новый на его место. |
|||
|
||||
| GZep |
|
|||
![]() участник Винграда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1528 Регистрация: 7.7.2006 Где: Москва Репутация: нет Всего: 32 |
Кстати, менеджер получился ИМХО куда менее громоздкий чем стандартные. Skipy, можно пример? Я так понимаю, вы имеете ввиду GridBagLayout? Почитайте топик. Я пытался найти решение стандартными менеджерами, но увы не смог сам и мне не помогли.
Вот не совсем понял, в принципе все в это и упиралось, что элементы добавляются динамически. -------------------- ![]() ![]() |
|||
|
||||
| CHEM_Eugene |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 12.2.2008 Репутация: нет Всего: нет |
метод setAlignmentX позволяет удивительным образом проделать тоже самое с BoxLayout, не заморачиваясь на собственных реализациях
|
|||
|
||||
| Skipy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 487 Регистрация: 24.8.2006 Где: Москва, Россия Репутация: 4 Всего: 16 |
Ну да, ступил. Ничего никуда не надо переносить, стандартными делается.
|
|||
|
||||
| GZep |
|
|||
![]() участник Винграда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1528 Регистрация: 7.7.2006 Где: Москва Репутация: нет Всего: 32 |
Skipy, спасибо понял вашу связку 2 менеджеров. Итого 2 работающих варианта. Какой выбрать?
Если использовать новый менеджер, который точно заточен под конкретную задачу, то из минусов получаем только необходимость использовать еще один класс. При варианте со связкой 2-х менеджеров имеем свои минусы (постараюсь объективно):
В принципе думаю тему раскрыли полностью, лично сам пока думаю остановиться на варианте с использование своего менеджера, хотя, может ошибаюсь. -------------------- ![]() ![]() |
|||
|
||||
| Skipy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 487 Регистрация: 24.8.2006 Где: Москва, Россия Репутация: 4 Всего: 16 |
1. Связка менеджеров - это норма. У меня иногда в формах до 10 вложенных контейнеров, и менеджеров, соответственно, 10. И совершенно необязательно одинаковые.
2. И что? Вы о памяти беспокоитесь? Не бойтесь, 10-20 кб погоды не сделают. P.S. Универсальные менеджеры хороши именно тем, что они универсальны. Менеджер, сделанный под конкретную задачу, во-первых, сложно переиспользовать, во-вторых, необходимо поддерживать. Изменились условия - и Вы будете переписывать код. А я в худшем случае поменяю пару параметров. Предлагаю подумать, что Вам надо изменить, чтобы элементы были прижаты не к верху, а к низу, в том же порядке. И что надо изменить мне (один параметр в одном методе). |
|||
|
||||
| GZep |
|
||||||||
![]() участник Винграда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1528 Регистрация: 7.7.2006 Где: Москва Репутация: нет Всего: 32 |
Тут наверное субъективно больше... но, например, в HTML не приветствуется глубокая вложенность. Вижу тут аналогию.
Но ведь этот минус не засчитывается. К нему просто таких требований нету.
Вот резонный аргумент! Действительно, кастомизация переезжает на уровень редактирования кода самого менеджера - это плохо.
Согласен. А вот еще один плюс нарисовался для собственного варианта - код инициализации. Вот он (продублирую, он был выше):
Согласитесь, тут код выглядит гораздо лучше чем тот же GridBagLayout + GridBagConstraints, не говоря уже о слое с BorderLayout. Честно говоря больше всего нравится как реализована компановка в https://github.com/jacek99/javabuilders (используется Yaml разметка). -------------------- ![]() ![]() |
||||||||
|
|||||||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |