Выровнять компоненты Swing по панелям - PullRequest
6 голосов
/ 21 сентября 2010

У нас есть JPanel, который содержит несколько JPanel, которые содержат JComponents (скажем, JLabels и JTextboxes)

Внутри каждого внутреннего JPanel мы используем макет JGoodies для обеспечения правильного выравнивания всех меток.

Но, конечно же, мы бы хотели, чтобы все метки были выровнены независимо от того, на какой они субпанели.

Как мы можем это сделать, не фиксируя ширину столбца, содержащего JLabels?

Мы не можем потерять JPanels, поскольку нам нужно иметь границы вокруг групп компонентов

Ответы [ 5 ]

7 голосов
/ 01 июня 2012

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

Но если вы хотите выровнять по нескольким редакторам или формам, описанная выше методика не работает. JGoodies FormLayout предоставляет два уровня для решения этой проблемы и, в более общем плане, для улучшения согласованности макета: 1) нижние границы для размеров, 2) переменные макета.

С помощью 1) вы можете описать макеты, обеспечивающие минимальную ширину по формам. Например, если вы хотите сказать, что все столбцы меток имеют ширину не менее 100 пикселей, вы можете сказать «[100px, pref]» для столбца меток.

2) выходит за пределы подхода 1). И мотивация состоит в том, чтобы извлечь 100px из ваших многочисленных форм. В FormLayout вы можете установить переменные макета, например, $ label, который вы настроили как «[100px, pref]» или «right: [75dlu, pref]» и т. Д. Если вы используете переменную макета во всех ваших редакторах, они будут согласованно, и у вас есть единственное место, где вы можете настроить все столбцы меток для всех редакторов.

4 голосов
/ 21 сентября 2010

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

  • Напишите свой собственный менеджер макетов (или дополните существующий) с этой возможностью
  • Фиксированная ширина столбцов
  • Решите, что панели, визуально разделенные границами, не обязательно должны выравнивать содержимое в конце концов
2 голосов
/ 21 сентября 2010

То, что у JPanel есть границы, не означает, что им действительно нужно содержать видимое содержимое Установите панели прозрачными. Добавьте панели и компоненты на ограждающую панель. Добавьте компоненты распорки, чтобы имитировать вставки панелей в макете. Вам также необходимо отключить «оптимизированный чертеж» или что-то подобное для перекрывающихся компонентов.

1 голос
/ 26 июня 2011

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

JSeparator дает визуальный эффект группировки виджетов, но сами по себе являются просто еще одним простым виджетом, вписывающимся в тот же JPanel. Прочитайте учебник для важных советов, таких как установка предпочтительного размера. http://download.oracle.com/javase/tutorial/uiswing/components/separator.html

Кроме того, текущие рекомендации Apple предлагают просто использовать пустое пространство в качестве разделителя между группами, в качестве альтернативы границам и разделителям.

0 голосов
/ 08 августа 2012

Этот пример кода может помочь решить проблему с выравниванием:

//c is instance of the content pane
c.setLayout(gl=new GridLayout(3,0));
//jp is a jpanel. I took this panel because there is no alignment
//setting for a specifiq cell of grid Layout.
jp.setAlignmentX(CENTER_ALIGNMENT);
//jl is the jLabel
jp.add(jl);
//finally I add that with the frame
c.add(jp);

Надеюсь, это поможет вам решить вашу проблему.

...