Java AWT/SWT/Swing: Как запланировать GUI?

28
задан Vadim Kotov 23 October 2017 в 13:25
поделиться

10 ответов

Я не большой поклонник построителей графического интерфейса: они обычно автоматически генерируют целую кучу кода, который затем заставляет всю вашу команду разработчиков использовать одну IDE. Кроме того, этот код часто нечитаем (проверьте код, сгенерированный при использовании Matisse в Netbeans).

Мои рекомендации по разработке / отладке графического интерфейса:

  • Добавьте метод main в каждую панель (или компонент "верхнего уровня"), позволяя другим разработчикам легко определять, как выглядит компонент.
  • Отдавайте предпочтение использованию Action s вместо ActionListener s и регистрируйте эти действия с помощью каждый JComponent ActionMap . Это позволяет «извлекать» их и добавлять в другие части пользовательского интерфейса (например, JToolBar ), в то время как их состояние все еще контролируется «владеющим» JComponent (т. Е. Слабая связь).
  • Используйте assert, чтобы гарантировать, что все модификации компонентов пользовательского интерфейса происходят в диспетчере событий нить; например assert SwingUtilities.isEventDispatchThread () .
  • Чтобы отладить странное поведение макета, подумайте о том, чтобы закрасить фон компонента в красный цвет!
  • Централизуйте сбор и отправку отчетов о событиях и исключениях рабочего процесса. Например, я обычно реализую класс TaskManager , который зарегистрирован в строке состояния моего пользовательского интерфейса. Любая фоновая обработка (выполняемая в SwingWorker s) передается дескриптором Task , созданной TaskManager . Взаимодействие с Задачей (путем вызова setDescription (String) , setThrowable (Throwable) , cancel () ) вызывает обновление строки состояния. Это также вызывает отображение стеклянной панели для «глобальных» задач ... но все это отделено / скрыто от отдельных SwingWorkers.
  • Не используйте Observer / Observable ], но вместо этого предпочитают ChangeListener , PropertyChangeListener или вашу собственную реализацию пользовательского прослушивателя для распространения событий. Наблюдатель передает объект как событие, заставляя клиентский код проверять тип с помощью instanceof и выполнять понижающие преобразования, делая код нечитаемым и делая отношения между классами менее ясными.
  • Поддерживайте использование JTable вместо JList , даже в ситуациях, когда ваша таблица имеет только один столбец. JList имеет некоторые неприятные особенности в своем API, включая тот факт, что вам необходимо предоставить значение прототипа, чтобы он правильно рассчитал его размер.
  • Никогда не используйте DefaultTableModel , поскольку это обычно приводит к вы храните свои «модельные» данные в двух местах: в ваших реальных бизнес-объектах, а также в 2D-массиве, на котором находится DefaultTableModel . Вместо этого просто создайте подкласс AbstractTableModel - это очень легко сделать, и это означает, что ваша реализация может просто передать полномочия структуре данных (например, List ) для хранения ваших данных.
73
ответ дан 28 November 2019 в 02:30
поделиться

Сделайте вручную. Построители графического интерфейса не годятся, если у вас нет концепции «частичного класса» в C #, и даже тогда они часто вызывают больше проблем, чем решают. Используйте инструменты построения графического интерфейса для создания прототипа - конечно, но не для производственного кода.

Кроме того, еще один небольшой трюк, который я использовал на протяжении многих лет, чтобы добиться хорошего эффекта при попытке отладить макет или «какую панель я действительно вижу здесь «проблема заключается в том, чтобы дать каждой панели« контейнер »действительно яркий цвет фона (желтый, синий и т. д.). Что-то достаточно очевидное, что вы увидите это, даже если оно будет шириной всего в один пиксель.

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

2
ответ дан 28 November 2019 в 02:30
поделиться

Я использую JFormDesigner для генерации графического интерфейса. Он генерирует красивый чистый java-код, и я многому научился, читая сгенерированный код. Делает локализацию простой.

Это действительно быстрый способ собрать сложный макет, особенно сложные строки меню и макеты сетки.

1
ответ дан 28 November 2019 в 02:30
поделиться

Я один из тех архаичных парней, которые делают разметку GUI вручную. Я также не боюсь печально известного GridBagLayout !

Я стараюсь упростить себе жизнь, подражая стандарту кодирования, который использовался Visual Age много лет назад: я использую много JPanel для организации частей GUI, и каждый получает свой собственный метод makeXXX () для его создания, размещения и возврата в родительскую панель или конструктор. Таким образом, каждый makeXXX должен сосредоточиться только на небольшой части всей работы.

Некоторые компоненты должны быть доступны с помощью различных методов экземпляра; Я объявляю их полями экземпляра. Остальные вещи, это просто украшение или макет, не нужно раскрывать за пределами методов makeXXX .

В основном это все. У меня работает.

5
ответ дан 28 November 2019 в 02:30
поделиться

NetBeans может быть лучшим вариантом для создания графического интерфейса пользователя в стиле WYSIWYG, но многие разработчики Java пишут свой графический интерфейс вручную, поскольку это не так сложно. Позаботьтесь о толщине границ и промежутках между элементами управления, и все в порядке :)

1
ответ дан 28 November 2019 в 02:30
поделиться

Для Eclipse существовал временно мертвый (но теперь, по крайней мере, полуживой) плагин для визуального проектирования графического интерфейса, и Netbeans все еще поддерживает его. Однако полученный код был не столь выдающимся. По крайней мере, для людей, которым приходится впоследствии работать с этой кодовой базой, это довольно неприятно.

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

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

Я стараюсь не слишком много думать о конкретном макете в Winforms и WPF из-за того, как вы также отметили, сильная дизайнерская поддержка. Кроме того, WPF очень легко обрабатывать даже в XAML. Частичные классы Ans делают очень приятной работу с частично созданным дизайнером и частично рукописным кодом. Увы, в мире Java такого нет.

1
ответ дан 28 November 2019 в 02:30
поделиться

Я бы посоветовал вам использовать netbeans для разработки графического интерфейса в AWT / SWING.

С уважением, Самир

0
ответ дан 28 November 2019 в 02:30
поделиться

Хотя редактор Matisse NetBeans, по общему признанию, удобен, код, который он создает, довольно эзотеричен, а макеты хрупки. Итак, я взял лучшее из обоих миров, используя NetBeans для создания прототипов WYSIWYG, а затем вручную перекодировал все это.

0
ответ дан 28 November 2019 в 02:30
поделиться

Помимо обсуждения инструментов, несколько идей и мыслей

  1. Прежде чем коснуться клавиатуры, нарисуйте элементы графического интерфейса пользователя на бумаге. Как классическая раскадровка, используемая для видеопроизводства. Если у вас есть клиенты, используйте нарисованные от руки (!) Дизайны, чтобы донести свои идеи (.. просто прочтите, что вы уже планируете на бумаге)
  2. Планирование реализации шаблона модель-представление-контроллер (MVC) или модель-представление-презентатор
  3. Привязка данных - отличный метод для рассмотрения. Он гарантирует синхронизацию между вашей моделью (данными) и представлением (GUI) и предлагает проверку ввода, преобразование на лету и многие другие полезные вещи (предоставлена ​​ссылка для привязки данных JFace, но я уверен, что есть и другие структуры для Swing / AWT тоже)
1
ответ дан 28 November 2019 в 02:30
поделиться

Я сам использую

Pencil

сначала для создания прототипов, а затем начинаю кодирование «вручную» (т.е. без использования какого-либо редактора графического интерфейса).

1
ответ дан 28 November 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: