Java AWT / SWT / Swing: как спланировать графический интерфейс? - PullRequest
27 голосов
/ 16 ноября 2009

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

Теперь мой вопрос:

Как вы планируете эти пользовательские интерфейсы? Что вы делаете, когда вам нужно внести изменения? Как вы отлаживаете странное поведение?!

Это относится практически ко всем типам графического дизайна. Конечно, с Microsoft Visual Studio у вас есть большое преимущество, потому что вы почти получаете то, что видите в конструкторе.

Существует ли хороший и дизайнер с открытым исходным кодом (или бесплатный) для AWT? Уже огляделся и не нашел ничего по-настоящему умного.

РЕДАКТИРОВАТЬ: До сих пор я также создал все свои GUI вручную. Конечно, это более чистый код, но иногда очень трудно найти ошибки в макете. Если Visual Studio от MS умеет создавать приблизительно чистый код, почему нет других?

Я слышал о каком-то дизайнере Eclipse Visual. Это уже готово к производству?

Ответы [ 10 ]

72 голосов
/ 16 ноября 2009

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

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

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

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

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

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

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

2 голосов
/ 16 ноября 2009

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

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

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

1 голос
/ 03 февраля 2010

я для себя использую

Карандаш

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

1 голос
/ 16 ноября 2009

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

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

1 голос
/ 16 ноября 2009

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

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

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

1 голос
/ 16 ноября 2009

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

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

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

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

0 голосов
/ 16 ноября 2009

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

0 голосов
/ 16 ноября 2009

Я бы предложил вам использовать netbeans для разработки GUI в AWT / SWING.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...