Адекватны ли менеджеры Swing LayoutManager?

Мне просто нужно было добавить флажок в приложение, которое было написано до того, как я попал сюда, и это было намного сложнее, чем должно было быть, потому что приложение использует какой-то сторонний LayoutManager, который пытается выполнять псевдоабсолютное сеточное позиционирование. API был ужасен, он принимает строки, обозначающие позицию, которые представляют собой разделенные запятыми списки из двух, четырех или шести параметров (я до сих пор не знаю, почему это меняется), и я бы предпочел, чтобы LayoutManager обрабатывал многое из этого. во всяком случае, чертова работа. Я всегда чувствовал, что позволяя Swing позиционировать вещи сам по себе, приводил к лучшей организации, чем все, что я мог бы создать. Я чувствовал то же самое с приложениями CGI, где, кроме случайной группировки флажков или переключателей с таблицами, я в значительной степени просто позволял браузеру течь и обертывать вещи, как хочет пользователь.

Адекватны ли реализации LayoutManager, включенные в Swing, или действительно необходимо включить такой вид абсолютного контроля, чтобы заставить макет быть именно тем, что вы хотите (и дать вам еще миллион решений)?

Я не удержался, но если кто не знаком с "полностью грохотом" ... madbean.com/anim/totallygridbag

Uri 26.11.2008 01:36

Любые комментарии к GroupLayout? Я недавно прочитал здесь, что это jgoodies внизу.

OscarRyz 02.12.2008 10:07

После изнурительной борьбы за реализацию моего «просто такого» макета с помощью SpringLayout мне удалось получить его именно так, как я хотел, с помощью GroupLayout. Думаю, я не знал о GroupLayout до того, как прочитал этот ответ, большое спасибо! GroupLayout позволяет создавать вложенные макеты на основе сетки, не требуя вложенных контейнеров; и это позволяет определять ограничения размеров для компонентов, используя их собственный предпочтительный размер. Рекомендуемые!

Carl Smotricz 03.12.2009 10:32
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
3
1 445
9

Ответы 9

Менеджеров компоновки из Swing обычно достаточно, чтобы делать то, что вы пытаетесь сделать. В «худшем» случае вам придется использовать полностью GridBagLayout и позиционировать каждый компонент по своему усмотрению, используя координаты. Судя по вашему вопросу, похоже, что ваша компания написала прикрытие, позволяя вам добавлять компоненты, используя какую-то причудливую схему ввода. Как правило, я бы рекомендовал не создавать новый менеджер компоновки, если вы действительно не можете объяснить, как ни один из встроенных менеджеров не делает то, что вам нужно, и что их нельзя легко объединить, чтобы делать то, что вам нужно.

Эта ситуация становится намного лучше. Я бы сказал, что три наиболее распространенных нестандартных менеджера верстки:

  • JGoodies FormLayout
  • TableLayout
  • MigLayout

Последние два очень похожи, но MigLayout появился немного позже и в будущем станет частью JDK. Я бы сказал, что любой из трех имеет достаточно «стандарт», чтобы его можно было довольно удобно использовать, но MigLayout, вероятно, выиграет, теперь он станет частью самого Swing.

Так что на данный момент я бы сказал нет. Когда MigLayout будет в JDK, да.

MigLayout - отличный инструмент для ручных менеджеров по компоновке - настоятельно рекомендуется.

Kevin Day 26.11.2008 04:05

Вы уверены, что MiGLayout станет частью JDK в будущем? Если да, объясните почему здесь: stackoverflow.com/questions/2092371/…

Epaga 19.01.2010 13:07

Я уже много раз использовал Miglayout, и это мой предпочтительный менеджер компоновки для компоновок Swing. Его легко использовать и еще проще отлаживать благодаря имеющейся в нем функции отладки.

JPM 13.07.2011 19:43

Я никогда не был большим поклонником менеджеров компоновки Swing, но я пришел в Swing после того, как много работал над Motif. Я не уверен, что это такое, но мне не кажется, что Swing обладает способностью для чего-то, вложенного ниже, «выталкивать» и заставлять предметы, находящиеся выше, быть достаточно большими, чтобы они поместились. Я был большим поклонником XmForm, и в Swing нет ничего подобного.

Тем не менее, 90% времени в Swing я использую кучу вложенных ящиков - обычно вертикальных ящиков внутри горизонтальных ящиков внутри вертикальных ящиков. Иногда мне нужно больше контроля, и я написал мануал по GridBagLayout и вздрогнул.

По моему опыту, они адекватны, если вы подготовлены к небольшому вложению (в некоторых случаях к большому вложению!)

В любом случае, я всегда считал, что менеджеры по расположению доставляют больше проблем, чем они того стоят.

Вы бы не сказали этого, если бы вам пришлось поддерживать интернационализацию. Каждый раз, когда вы получаете новый перевод, все ваши ярлыки должны быть изменены, чтобы соответствовать новым более длинным строкам.

Paul Tomblin 26.11.2008 00:07

Вы хотите сказать, что вручную размещаете компоненты в абсолютных позициях?

Draemon 26.11.2008 03:04

Лично я считаю, что концепция управления компоновкой Java - самая крутая вещь со времен нарезанного хлеба; важно для окон с изменяемым размером - просто посмотрите на все окна в Windows, размер которых нельзя изменить, как на указание на то, что наличие диспетчера абстрактной компоновки - хорошая идея.

Тем не менее, менеджеры компоновки в Java - это адекватный, но для того, чтобы добраться туда, где вам нужно, требуется изрядное количество вложений. Такая вложенность затрудняет внесение изменений. Взгляните на BoxLayout и BorderLayout как на свои основные продукты; используйте GridBagLayout только в крайнем случае.

Лучший вариант - включить приличный макет, ориентированный на таблицы, чтобы свести к минимуму вложенность; другие уже предложили несколько, поэтому я не буду повторяться. Я скатил свой, потому что мне нужны ограничения на основе String и крошечный размер, но в остальном я был весьма соблазнен TableLayout; и если размер дистрибутива не является объектом, вы обязательно должны взглянуть на виджеты и макеты, предлагаемые jGoodies (бесплатно, я думаю, но, возможно, только для некоммерческого использования ??)

Я обычно использую макет таблицы для окна и в итоге оказываюсь вложенным только иногда и обычно только на один уровень в глубину для прогонов связанных компонентов, скажем, три поля для номера телефона, разделенных двумя метками для дефисов между ними. Я считаю, что мои окна очень удобны в обслуживании, и их легко добавлять и менять.

PS: Избегайте абсолютного позиционирования, как чума.

Из любопытства, какого из следующих значений налета необходимо избегать? en.wikipedia.org/wiki/Plaque Невозможно увидеть вред в «биопленке, которая накапливается на зубах», ни в «плоской декоративной пластине или табличке, прикрепленной к стене, используемой для обозначения значительного события, человека и т. д.» = P

Keeg 02.12.2008 10:02

Мне потребовалась секунда, чтобы понять это ... это слишком смешно! Я исправил опечатку.

Lawrence Dol 02.12.2008 11:57

MiGLayout имеет строковые ограничения ...

PhiLho 10.12.2008 20:52

@PhiLho: MigLayout не существовал, когда я писал свой, или я не нашел его, когда исследовал альтернативы.

Lawrence Dol 20.12.2008 21:33

Из вашего описания вы можете использовать TableLayout. Если да, то я обнаружил, что он во многих отношениях превосходит стандартные менеджеры по компоновке. Если это TableLayout, попробуйте прочитать документацию, и тогда вы поймете, почему иногда бывает разное количество параметров позиционирования. TableLayout также позволяет вам установить эти параметры по-другому, без Strings.

В дополнение к трем вышеупомянутым сторонним менеджерам компоновки вы можете попробовать DesignGridLayout, который, хотя и не такой мощный, как MigLayout, намного проще в использовании и затрудняет разработку плохих форм.

Отказ от ответственности: я являюсь одним из авторов DesignGridLayout, но я действительно считаю, что это хороший LayoutManager по сравнению с Swing по умолчанию, а также с другими сторонними макетами, которые слишком сложны для начала.

Я всегда думал, что GridBagLayout - действительно мощный LayoutManager. К сожалению, кривая обучения, чтобы овладеть им, может быть слишком крутой. Моя первая работа не позволяла нам использовать какие-либо конструкторы графического интерфейса, поэтому весь код графического интерфейса был написан от руки. Мне всегда казалось, что это лучший способ изучить GridBagLayout, запачкать руки. В настоящее время, будучи старым и ленивым, я в основном использую NetBeans, но я все еще никогда не чувствовал необходимости рассматривать другие LayoutManager, поскольку GridBagLayout может делать все.

Для меня также сетка - действительно хороший способ разметки. Просто имеет смысл организовать свой макет таким образом и думать о нем в терминах строк и столбцов.

Я не работал над Swing уже пару лет, но менеджеры по расположению - это одна из вещей, которых я больше всего скучаю при написании веб-страниц. Мы проделали большую работу с GridBagLayout, особенно для более сложных диалогов, и после освоения было относительно легко использовать - когда пишу экраны. Боль всегда возникала, когда приходилось изменять графический интерфейс, а то, что на первый взгляд могло показаться простым, занимало уйму времени.

Я познакомился с Abeille, инструментом для проектирования форм графического интерфейса пользователя, и хотя он не идеален, он позволяет создавать экраны за считанные минуты с профессионально выглядящими результатами, особенно в сочетании с JGoodies. Он включает генератор кода или выводит его в двоичном формате (я думаю, что позже он включил XML), что было моим предпочтительным вариантом. Код для «сборки» экрана выглядел следующим образом:

FormPanel panel = new FormPanel( "myDialog.jfrm" );
add(panel);

Вы можете подключиться к элементам управления в форме для прослушивателей действий, и при использовании шаблона MVC вы получите действительно чистый код представления. Самым большим преимуществом является внесение изменений, так как форму можно просто загрузить в редактор, изменения быстро вносятся и сохраняются без изменения кода.

(Я никак не связан с Abeille, просто большой поклонник)

Другие вопросы по теме