Я не большой поклонник построителей графического интерфейса: они обычно автоматически генерируют целую кучу кода, который затем заставляет всю вашу команду разработчиков использовать одну IDE. Кроме того, этот код часто нечитаем (проверьте код, сгенерированный при использовании Matisse в Netbeans).
Мои рекомендации по разработке / отладке графического интерфейса:
main
в каждую панель (или компонент "верхнего уровня"), позволяя другим разработчикам легко определять, как выглядит компонент. Action
s вместо ActionListener
s и регистрируйте эти действия с помощью каждый JComponent
ActionMap
. Это позволяет «извлекать» их и добавлять в другие части пользовательского интерфейса (например, JToolBar
), в то время как их состояние все еще контролируется «владеющим» JComponent
(т. Е. Слабая связь). 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
) для хранения ваших данных. Сделайте вручную. Построители графического интерфейса не годятся, если у вас нет концепции «частичного класса» в C #, и даже тогда они часто вызывают больше проблем, чем решают. Используйте инструменты построения графического интерфейса для создания прототипа - конечно, но не для производственного кода.
Кроме того, еще один небольшой трюк, который я использовал на протяжении многих лет, чтобы добиться хорошего эффекта при попытке отладить макет или «какую панель я действительно вижу здесь «проблема заключается в том, чтобы дать каждой панели« контейнер »действительно яркий цвет фона (желтый, синий и т. д.). Что-то достаточно очевидное, что вы увидите это, даже если оно будет шириной всего в один пиксель.
И мой любимый макет для простых диалогов - BoxLayout. Это не здорово, вам нужно написать много шаблонов, но, по крайней мере, в целом он работает так, как вы ожидаете от мысли. Не зацикливайтесь на макетах, пока это не понадобится.
Я использую JFormDesigner для генерации графического интерфейса. Он генерирует красивый чистый java-код, и я многому научился, читая сгенерированный код. Делает локализацию простой.
Это действительно быстрый способ собрать сложный макет, особенно сложные строки меню и макеты сетки.
Я один из тех архаичных парней, которые делают разметку GUI вручную. Я также не боюсь печально известного GridBagLayout
!
Я стараюсь упростить себе жизнь, подражая стандарту кодирования, который использовался Visual Age много лет назад: я использую много JPanel для организации частей GUI, и каждый получает свой собственный метод makeXXX ()
для его создания, размещения и возврата в родительскую панель или конструктор. Таким образом, каждый makeXXX
должен сосредоточиться только на небольшой части всей работы.
Некоторые компоненты должны быть доступны с помощью различных методов экземпляра; Я объявляю их полями экземпляра. Остальные вещи, это просто украшение или макет, не нужно раскрывать за пределами методов makeXXX
.
В основном это все. У меня работает.
NetBeans может быть лучшим вариантом для создания графического интерфейса пользователя в стиле WYSIWYG, но многие разработчики Java пишут свой графический интерфейс вручную, поскольку это не так сложно. Позаботьтесь о толщине границ и промежутках между элементами управления, и все в порядке :)
Для Eclipse существовал временно мертвый (но теперь, по крайней мере, полуживой) плагин для визуального проектирования графического интерфейса, и Netbeans все еще поддерживает его. Однако полученный код был не столь выдающимся. По крайней мере, для людей, которым приходится впоследствии работать с этой кодовой базой, это довольно неприятно.
Что касается меня, я обычно заранее планирую на бумаге и пытаюсь получить все вложения панелей с их макетами прямо с первой попытки. По моему опыту, код графического интерфейса Java изначально предназначен только для записи.
В прошлый раз, когда я сделал такую вещь, я сначала создал все элементы управления, которые мне были нужны, а затем собрал их вместе в нескольких панелях и макетах и т.д. без особой боли при внесении изменений.
Я стараюсь не слишком много думать о конкретном макете в Winforms и WPF из-за того, как вы также отметили, сильная дизайнерская поддержка. Кроме того, WPF очень легко обрабатывать даже в XAML. Частичные классы Ans делают очень приятной работу с частично созданным дизайнером и частично рукописным кодом. Увы, в мире Java такого нет.
Я бы посоветовал вам использовать netbeans для разработки графического интерфейса в AWT / SWING.
С уважением, Самир
Хотя редактор Matisse NetBeans, по общему признанию, удобен, код, который он создает, довольно эзотеричен, а макеты хрупки. Итак, я взял лучшее из обоих миров, используя NetBeans для создания прототипов WYSIWYG, а затем вручную перекодировал все это.
Помимо обсуждения инструментов, несколько идей и мыслей
Я сам использую
сначала для создания прототипов, а затем начинаю кодирование «вручную» (т.е. без использования какого-либо редактора графического интерфейса).