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