Подтвердить что ты не робот

Почему он неодобрительно использует пустой макет в Swing?

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

Дело в том, что программа будет работать на нескольких компьютерах разных размеров и разрешений (800x600 и выше). Чтобы убедиться, что требуется как можно больше экрана без потери какой-либо части программы, я устанавливаю макет нулевым и жестко закодированным, используя относительные значения.

Программа является киоск-стилем, и я сначала получаю значения размера экрана и оттуда (например, от верхней части головы, в левом меню занимает восьмое место экрана, верхняя панель - 2% и т.д.). Я также использую метрики шрифтов, чтобы убедиться, что компоненты правильно отсортированы и что все отображается хорошо.

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

Как вы, более опытные программисты, используете менеджеров макета в такой ситуации? И что вы будете делать, когда хотите, чтобы кнопка была где-то конкретным и другие компоненты где-то в другом месте, которые не соответствуют каким-либо из предопределенных макетов?

4b9b3361

Ответ 1

Если вы правильно нарисуете менеджеров компоновки, экран будет перетекать в разные размеры для вас, идея состоит в том, чтобы использовать один набор менеджеров макета для всех размеров экрана.

Если вы используете null, вам придется делать каждый размер экрана самостоятельно. Не только это, но если приложение может быть оконно, вы должны поддерживать все возможные размеры, которые они могли бы прокручивать.

Такой трудный путь, но макетщики предназначены для этого.

Есть некоторые общие трюки. BorderLayout - отличный макет для начала. Иногда вы можете использовать его на нескольких уровнях - часто с двумя или тремя компонентами. Это потому, что он действительно хорош для того, чтобы дать всем, кроме одной области, минимальную требуемую область и отдавать все остальное ЦЕНТРУ.

FlowLayout может быть полезным, но это сложно, если ваши компоненты имеют разные размеры.

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

Я также не буду использовать GUI-сборщики, они не знают, как вы хотите перепланировать ваш макет.

Ответ 2

Вкратце: потому что все работы, которые вы объясняете выше, выполняются менеджером компоновки (или, по крайней мере: должно быть сделано).

Чаще всего, когда используется нулевой макет, это также подразумевает, что все позиции и размеры жестко привязаны к одному значению, поэтому никакой гибкости вообще не предоставляется. Это означает, что изменения размера окна, языка, размера шрифта, плотности отображения или любого другого связанного параметра не влияют на макет, и вы получаете обычные уродливые эффекты: пустые части окна; крошечные, неустранимые списки; кнопки с обрезанными метками;...

Похоже, что работа, которую вы делаете, действительно должна выполняться Менеджером макетов. Либо найдите тот, который делает это (мое личное предложение было бы MiGLayout, что очень много и легко использовать) или написать свое собственное.

Ответ 3

Практически вы используете макет - свой, со всеми вашими сложными вычислениями позиций.

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

Ответ 4

hmmm трюк должен быть смешением LayoutMangers и использованием чисел вложенных JPanels, каждый из которых может иметь разный макет или нет, действительно зависит от количества JComponents, который позволяет вам создавать графический интерфейс, который выглядит как как заложено с помощью AbsoluteLayout, но с таким же внешним видом и выходом в графический интерфейс для каждого разрешения экрана и соотношения (4: 3, 16: 9, 16: 10)