#java #swing #user-interface #architecture
#java #swing #пользовательский интерфейс #архитектура
Вопрос:
Я написал несколько графических интерфейсов, используя Swing, и я знаю о MVC, но я так и не нашел хорошего способа как-то организовать свой код. То, что я ищу, — это что-то вроде структуры папок, которую maven вводит для каждого нового проекта. Другим примером является rails, где MVC автоматически вводится через структуру папок. Есть ли что-то подобное для Swing?
Также было бы неплохо увидеть книгу, в которой описывается разработка более крупного приложения на Swing. Все, что я нахожу, — это книги о дизайне — руководства, где дизайн относится к внешнему виду приложения. В других книгах по Swing (например, O’Reilly) подробно описываются все компоненты Swing, но где какая-либо информация об общей картине?
Есть ли какие-нибудь хорошие примеры графического интерфейса swing, где вы бы сказали «Вот как вы организуете код / папки / пакеты для swing!»?
РЕДАКТИРОВАТЬ: я нашел следующий сайт http://www.ibm.com/developerworks/java/tutorials/j-springswing/section7.html в котором описывается использование spring при создании графического интерфейса. Это довольно старый пример, и он не отвечает на мой вопрос, но это шаг в правильном направлении. Здесь также упоминается Spring RCP, но я не уверен, что это может быть решением.
ПРАВКА2: Я все еще не нашел лучших ответов. Кто-нибудь знает пример идеально структурированного графического интерфейса Swing с открытым исходным кодом? Кто-нибудь знает книгу, в которой это описывается? И если не для Swing, то, может быть, для GUI в целом?
Комментарии:
1. Боюсь, что нет исчерпывающего ресурса, который отвечал бы на этот вопрос в целом. Вместо этого вам придется проверить несколько (много) ресурсов в Интернете, каждый из которых описывает другой аспект. Вы также можете ознакомиться с конкретными примерами приложений Swing (с открытым исходным кодом) и посмотреть, как они организованы. Что действительно важно, на мой взгляд, это инструменты сторонних производителей, которые вы хотите использовать (например, макеты, фреймворки, таблицы, виджеты, шина событий, DI, внедрение ресурсов …); их действительно много, невозможно перечислить здесь. В качестве отправной точки вы могли бы взглянуть на мой проект GUTS-GUI.
2. @JFpoilpret: Не могли бы вы предоставить ссылку? И в последний раз, когда я проверял (больше года назад), у него было довольно мало документации. Я имею в виду, что GUITS-GUI наполнен невероятно полезными идеями, но мне пришлось находить их, тщательно изучая его код. Полная документация значительно сэкономила бы время.
3. @Rekin вот ссылка: kenai.com/projects/guts/pages/Home . Большая часть документации находится в javadoc, который, я полагаю, довольно всеобъемлющий; в частности, вы должны взглянуть на часть описания пакета, которая намного больше, чем одно предложение (в отличие от многих других проектов). Кроме того, в SVN есть несколько примеров приложений, которые являются хорошими отправными точками.
Ответ №1:
Хотя это Groovy, а не Java, я бы посоветовал вам взглянуть на Griffon, который является «Grails для Swing«.
Он применяет заданную структуру (в терминах каталогов и шаблонов, в частности, MVC) ко всем приложениям, которые вы создаете с его помощью.
Я думаю, что это может дать вам хорошие идеи в целом, хотя вам пришлось бы выполнить небольшую адаптацию к Java.
Кроме того, пожалуйста, обратите внимание, что Griffon также поддерживает создание приложений на Java, и он также может предоставлять «архетипы» для этого, так что вы также можете это проверить.
Комментарии:
1. Этот ответ, похоже, наиболее близок к тому, что я искал, так что вознаграждение за это ваше. Тем не менее, я не совсем удовлетворен. Я подумал, что за все эти годы разработки на Swing должно быть больше общих рекомендаций и меньше взломов. Похоже, всем пришлось заново изобретать колесо при создании Swing-GUI.
2. Я поддерживаю ваш комментарий. Однако имейте в виду, что существует множество веб-ресурсов, посвященных отдельным аспектам Swing (или более общим аспектам пользовательского интерфейса, применимым к приложениям Swing). Это также было одной из причин для создания проекта GUTS-GUI, хотя это зависит от Guice, это помогает (поможет) легко начать писать приложения и предоставляет примеры, которым можно следовать. Я даже думаю, что после официального релиза я добавлю несколько архетипов maven, которые создадут структуру проекта для вас (плюс несколько классов для начала).
Ответ №2:
Вы можете прочитать обзор архитектуры Swing. Но когда я создаю большие приложения на Swing, я не организовываю их так же, как при веб-разработке. Я просто разделяю свои приложения Swing на функциональные части. Например, если в приложении есть четыре вкладки с формами и таблицами, я помещаю компоненты с одной вкладки в один пакет. Затем я обычно получаю несколько пользовательских реализаций AbstractTableModel
, с которыми взаимодействуют формы и таблицы. И модель хранит кэш данных и обменивается данными с базой данных.
В моем последнем приложении Swing я использовал актеров Akka для упрощения потоковой обработки. Затем все мои компоненты Swing были выполнены в EDT-потоке, и они взаимодействовали с объектом доступа к данным, который был пользовательским участником. Тогда у меня также было несколько TimerTask
, которые синхронизировали данные из базы данных со службами в Интернете, но они никогда не запускались на EDT, они только взаимодействовали с DAO (мой актер).
Комментарии:
1. Я уже знаком с обзором архитектуры Swing, но здесь это мне не очень помогает. Однако ваш способ организации пакетов, похоже, является частью решения для puzzle. Что вы делаете с компонентами, которые отображаются более чем на одной вкладке?
Ответ №3:
Веб-разработка заставляет вас использовать определенные исходные коды и макеты ресурсов. Это не относится к приложениям Swing. Здесь вы можете использовать макет, который наилучшим образом соответствует вашим целям.
Вы будете намного продуктивнее, если будете использовать какую-нибудь IDE. NetBeans — идеальный выбор для Swing. NB дает вам некоторые ограничения на то, как хранить ваши классы. Существует папка «Исходные пакеты», которая содержит пакеты Java и «Тестовые пакеты» для соответствующих тестовых классов JUnit, если вы используете JUnit, что я настоятельно рекомендую вам сделать.
В случае, если вы используете Hibernate, вы должны придерживаться его соглашений, создать whatever.entity и whatever.util, а конфигурационные XML-файлы должны быть в «пакете по умолчанию».
Любая дальнейшая организация этих пакетов зависит от программиста. Я создаю пакет с JFrame, который запускает все шоу. И пакет для каждой логической единицы. Иногда я использую пакет для AbstractTableModels и сохраняю их вместе, а другой — для ComboBoxModels. Нет необходимости создавать более глубокие структуры. У вас может быть отдельный пакет для значков, которые вы можете использовать для своих кнопок, один для звуков и т.д. Netbeans создает исполняемый файл jar для вашего приложения, в который включены все необходимые файлы, включая необходимые библиотеки jar.
Вот вам небольшой пример. Все названия пакетов, кроме ‘th’, вполне очевидны. ‘th’ — это название этого приложения, и у меня есть JFrame, в котором размещено приложение. Это приложение использует iReport для генерации отчетов. Для этого и предназначен пакет ‘iReports’.
Книги описывают меньшие образцы и больше касаются соглашений Java.
Вы могли бы попробовать Apache Maven и посмотреть, какую архитектуру они предоставляют с архетипами приложений.
Комментарии:
1. Обычно я использую Eclipse в качестве IDE вместе с Maven. К сожалению, не существует архетипа для Swing или даже для GUI в целом. Однако я нашел следующий пример, который ведет, по крайней мере, в правильном направлении: best-practice-software-engineering.ifs.tuwien.ac.at/basic /…
2. Eclipse отлично подходит для веб-приложений. Я использую его для GWT designer. Matisse для разработки на графическом языке Swing не является ни бесплатным, ни настолько хорошо интегрированным, как в Netbeans. MyEclipse очень хорош, но вам придется его купить (хотя и не слишком дорого). Если вы разрабатываете на Swing, попробуйте Netbeans. Это абсолютно бесплатно и непревзойденно для Swing. Вы найдете простые руководства в netbeans.com . Найденное вами приложение tuwien четко определено. Удачи!
Ответ №4:
К сожалению (или к счастью, это зависит от того, как вы на это смотрите), нелегко разработать универсальные панели, пригодные для нескольких структур данных. M часто тесно связано с V, а V часто содержит некоторое количество C.
Я склонен помещать панель V и соответствующую структуру M в один и тот же пакет. Вам также нужен какой-нибудь центральный управляющий дисплей для отображения каждой отдельной панели. C используется совместно между центральным управляющим дисплеем и самими панелями.
Теперь, если вам нужно больше структуры в вашем проекте, вы могли бы усовершенствовать фреймворк Struts 2, чтобы переместить все C в некоторых действиях и иметь панели (V), указывающие, каким должен быть следующий M / V для отображения. Struts изначально разрабатывался для веб-приложений, но Struts 2 теперь отделен от HttpServlet.
Сам я этого не пробовал, но вижу некоторые преимущества. Вы могли бы запускать последовательности тестовых экранов без фактического отображения экранов. Просто создайте панель panes instances pane и вызовите методы прослушивания с помощью событий (щелчок мыши и т.д.).
Просто идея.