Руководство по GUI для свинга - PullRequest
10 голосов
/ 25 февраля 2010

Есть ли ресурс, где объясняется дизайн графического интерфейса для свинга? Нравится лучшие практики и тому подобное.

Ответы [ 7 ]

34 голосов
/ 26 февраля 2010

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

  • Никогда не используйте GridBagLayout. Возьмите TableLayout. Это радикально упрощает макет Swing UI. GridBagLayout - это дьявол.
  • Не встраивайте компоненты просто для правильной компоновки (т. Е. Встроенный BoxLayout и т. Д.). Смотрите пункт 1 о том, как это сделать. Существуют проблемы с производительностью компонентов на экране.
  • Разделите вашу программу по линиям MVC. Swing имеет разделение View и Model, но в больших программах View (то есть, какие подклассы компонента Swing) превращаются в psuedo View / Controller, что только усложняет повторное использование и обслуживание. Это быстро превращается в спагетти-код. Откажитесь от привычки и создайте класс Controller, который НЕ расширяет Swing. То же самое касается модели (без качелей). Контроллер создает высокоуровневые классы представлений и связывает себя в качестве слушателя представлений.
  • Упростите всплывающие диалоги, используя только простые панели. Не подкласс JDialog. Создайте диалоговый класс многократного использования, который обертывает панель, которую можно использовать, например, JOptionPane. Ваши панели не будут привязаны только к диалогам и могут быть использованы повторно. Это очень легко, когда вы работаете таким образом.
  • Избегайте actionlistener / command. Это старое барахло и не очень многоразово. Используйте AbstractAction (анон классы по вашему выбору, у меня нет проблем с ними). AbstractAction инкапсулирует текст, значки, мнемонику, ускорители, многократно используемые в кнопках, всплывающих окнах, меню, ручках переключения состояний «включено / выключено», может использоваться несколькими компонентами, а также является основой для InputMap / ActionMaps для отображения нажатий клавиш на действия. ActionMaps дают вам много сил для повторного использования.
  • Лучше всего просматривать события диспетчеризации на контроллере. Я не говорю о мусоре мыши / клавиатуры, но о событиях высокого уровня. Как NewUserEvent, AddUserEvent, DeleteUserEvent и т. Д. Пусть ваш контроллер прослушивает эти высокоуровневые бизнес-события. Это будет способствовать инкапсуляции, сохраняя интересы представления (должен ли я использовать таблицу, список, дерево или что-то еще?) Отдельно от потока приложения. Контроллеру все равно, нажал ли пользователь кнопку, меню или флажок.
  • События не только для контроллера. Свинг - это программирование событий. Ваша модель будет делать что-то вне SwingThread или в фоновом режиме. Отправка событий обратно в контроллер - очень простой способ заставить его реагировать на события, происходящие на уровне модели, которые могут использовать потоки для выполнения работы.
  • Поймите правила потоков Swing! Вы будете удивлены, как мало кто на самом деле понимает, что Swing является однопоточным и что это означает для многопоточных приложений.
  • Понять, что делает SwingUtilities.invokeLater ().
  • Никогда * никогда не используйте SwingUtilities.invokeAndWait (). Ты делаешь это неправильно. Не пытайтесь писать синхронный код в программировании событий. (* В некоторых угловых случаях допустим invokeAndWait (), но в 99% случаев вам не требуется invokeAndWait ()).
  • Если вы начинаете новый проект с нуля, пропустите Swing. Это старое и все кончено. Sun никогда не заботилась о клиенте так, как о сервере. Свинг поддерживается плохо, и с тех пор, как он был впервые написан, прогресса не было. JavaFX еще не существует и страдает от множества грехов Swing. Я бы сказал, посмотрите на Apache Pivot . Множество новых идей, лучший дизайн и активное сообщество.
5 голосов
/ 26 февраля 2010

Может быть, не совсем то, что вы ищете, но вам не помешает взглянуть на Руководство по дизайну Java Look and Feel

5 голосов
/ 25 февраля 2010

В больших проектах свинга я делаю партию приложения так:

  • Имеется один класс для каждого элемента графического интерфейса, такого как JPanel, JDialog и т. Д.

  • Используйте отдельный пакет для каждого экрана, особенно если вам необходимо реализовать настраиваемые модели таблиц или другие сложные структуры данных

  • Не используйте анонимные и внутренние классы, вместо этого реализуйте ActionListener и проверьте там ActionEvent.getActionCommand ().

РЕДАКТИРОВАТЬ: Если вы предпочитаете учебник или введение, вы можете начать здесь

5 голосов
/ 25 февраля 2010

Я написал список рекомендаций здесь .

1 голос
/ 18 января 2012

У меня тоже есть некоторые рекомендации:

1) Используйте Maven и разделяйте ваше приложение на модули (представление, контроллер, сервис, постоянство, утилиты, модель). Убедитесь, что вы помещаете свои компоненты и зависимости Swing только в пакет представления, поэтому, если вы когда-нибудь захотите изменить среду представления, вы можете просто переопределить модуль представления, но вы можете оставить свою бизнес-логику, контроллеры и т. Д. Без изменений.

2) Используйте GridBagLayout, потому что он очень гибкий и наиболее настраиваемый

3) Используйте SwingTemplate (могу привести пример, если хотите)

4) Создайте SwingFactory, которая создает компоненты, так что вы можете уменьшить количество строк кода, поскольку JFrames или слишком большие классы ...

5) Пусть представление (JFrame, JDialog и т. Д.) Зависит от контроллеров. Вводите валидацию только в JFrames, но затем передавайте параметры в контроллеры. Они решат, какая бизнес-логика (служба, процессоры и т. Д.) Будет запущена.

6) Использовать много перечислений

7) Всегда думайте, как ваше приложение может измениться или как его можно поддерживать. Поэтому всегда используйте код против интерфейсов или абстрактных классов. (Думай абстрактно)

8) Используйте шаблоны проектирования в своем приложении, поскольку они обеспечивают согласованность и удобство сопровождения вашего кода. Сделайте, например, все ваши контроллеры, сервисы, синглтон-классы dao. Создавайте фабрики (swingfactory, ...), чтобы вам приходилось писать меньше кода снова и снова .... Используйте наблюдатели, чтобы действия могли обрабатываться автоматически.

9) Проверьте вашу заявку: выберите один из вариантов: TDD (тестирование по проекту) или DDT (тестирование по проекту)

10) Никогда не помещайте бизнес-логику в JFrames, потому что это уродливо и не очень дизайн Model-View-Controller. JFrames не интересуются тем, как обрабатываются данные.

Надеюсь, это поможет.

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

Некоторые из лучших практик можно найти в главе 4 Профессиональная версия Java JDK6

alt text

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

Вы можете проверить идеи, лежащие в основе FEST - фреймворка для свинг-тестирования. Его основной сайт здесь , а проект размещен здесь

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