Где найти хорошее, короткое, ориентированное на архитектуру введение в Java Swing GUI для веб-разработчиков?

Я только начинаю свой первый проект Java Swing (прежде всего, используя веб-приложения) и пытаюсь понять, как создать правильную архитектуру с разделением проблем между компонентами MVC.

Практически любая документация, которую я нахожу, очень глубоко вникает в детали того, как каждый виджет Swing UI работает и может быть использован, но все примеры просто непосредственно вызывают логику программы из класса, который распространяется, например, JPanel - что кажется нечетным и без хорошей архитекции.

Было бы лучше, если бы это было IDE-независимым, но если такие вещи вступают в игру, следует сказать, что в общем проекте у нас уже есть Eclipse, JFormdesigner и JGoodies.

Я также вижу, что JSR296 определяет структуру, которая, как представляется, касается моих проблем. Должен ли я просто использовать что-то, что его реализует?

Ответ 1

Это область программирования Java, которая сильно недооценена. Как вы говорите, расширение JFrame или JDialog для разработки графического интерфейса не является хорошей конструкторской практикой, но вы видите его повсюду в образце кода.

JSR 296 - полезное стартовое место, но у этой архитектуры есть серьезные проблемы. Я использую JSR 296, но у меня есть свой собственный вкус и постоянно приходится разбираться с проблемами, возникающими в дизайне структуры.

Я давно думал, что должна быть дискуссионная группа/wiki/что-то, сфокусированное на этой теме. До сих пор я нашел список рассылки для различных богатых клиентских библиотек полезными, но не всеобъемлющими. Что-то подумать о том, чтобы начать, может быть, в свободное время: -)

Поэтому я не могу предоставить какие-либо окончательные ресурсы для лучших практик в создании приложений swing. Но я могу дать вам несколько указаний на инструментальные средства и концепции, которые я нашел, что я использую снова и снова. Возможно, они будут полезны вам, когда вы пойдете. Кроме того, если достаточное количество людей заинтересовано в обсуждении лучших практик, обмене кода и т.д. Мне было бы интересно участвовать в нем.

Во-первых, некоторые абсолютно критические библиотеки, если вы собираетесь сделать разработку Swing:

  • Связывание - есть несколько библиотек, которые это делают (JGoodies, JSR295, который был выделен в проект с открытым исходным кодом под названием Better Beans Binding (BBB), Eclipse binding framework). Я начал много лет назад с помощью JGoodies, но я перешел к использованию BBB, потому что считаю, что он подходит для более интуитивного. Я не могу подчеркнуть преимущества метода декларативного кодирования, который позволяет привязка - это действительно революционизирует ваш код.

  • AppFramework (или некоторый вкус) - JSR 296 - это место, где можно начать здесь. Как я уже упоминал выше, у него есть некоторые проблемы: если вы используете JSR296, я настоятельно рекомендую вам избегать использования синглтона, лежащего в основе структуры (кроме как источника для инъекции компонентов инфраструктуры, которые вам действительно нужно).

EDIT - так как я написал это, я начал использовать GUTS в наших проектах (это основанная на Guice платформе приложений - она ​​начала жизнь как JSR 296, но с ней очень мало общего). GUTS по-прежнему остается молодым проектом, но стоит взглянуть на него, если вы рассматриваете рамки.

  1. GlazedLists - если вы что-то делаете в пользовательском интерфейсе, который включает в себя списки, таблицы или деревья, вы должны внимательно изучить GlazedLists. Это невероятный проект (не только для приложений Swing, но он действительно сияет на этой арене)

  2. Валидация - у JGoodies есть очень хорошая библиотека проверки. Изучите его, используйте его, будьте едины с ним. Валидация в реальном времени - невероятно важная часть современного приложения Swing.

  3. MigLayout - Менеджер компоновки Mig лучший. Я настоятельно рекомендую искушение использовать конструктор GUI IDE - узнайте MigLayout (это займет пару часов, вершины) и скомпилируйте вещи вручную.

Итак, это ключевые, абсолютно обязательные библиотеки в моей книге.

Теперь некоторые понятия:

а. Модель представления - у Мартина Фаулера много информации об этом шаблоне проектирования. Длительный и короткий, он отделяет поведение от представления на уровне GUI. ЕСЛИ вы привыкли к MVC, модель Presentation добавляет еще один уровень разделения, что очень важно для "живых" пользовательских интерфейсов. Все мои взгляды поддерживаются соответствующей моделью презентации. Конечным результатом является то, что код представления действительно, очень прост - фокусируется на двух вещах: 1. Макет и 2. Связывание компонентов представления с моделью презентации. Что это.

В. Представления НЕ являются подклассами JPanel. Вместо этого я следую методике JGoodies, рассматривающей представление как строителя, создающего JPanels. Основной шаблон:

public class MyView{
  private MyPresentationModel model;

  private JButton okButton;
  private JButton cancelButton;
  ...

  public MyView(MyPresentationModel model){
    this.model = model;
  }

  public JPanel buildView(){
    initComponents(); // this method actually creates the okButton and cancelButton objects
    bindComponentsToModel(); // this method binds those objects to the PresentationModel
    JPanel p = new JPanel(new MigLayout());
    p.add(...);
    ...
    return p;
  }
}

Этот подход, последовавший религиозно, позволяет невероятно быстро развивать пользовательские интерфейсы, которые легко поддерживать. Обратите внимание, что мы можем использовать данный View для создания нескольких JPanels, все из которых поддерживаются одним и тем же PresentationModel. Изменения на одной панели, сгенерированной представлением, будут немедленно видны на другой панели, сгенерированной одним и тем же представлением.

С. Используйте Actions not event обработчики. JSR 296 действительно делает хорошую работу по упрощению создания и работы Actions.

Д. Выполняйте длительные операции (даже то, что занимает 100 мс) от EDT. JSR 296 делает это довольно легко с ним. Поддержка задач - но в 296 Task System есть ряд исправлений, когда дело касается обработки исключений. Если у вас есть изменения свойств, которые, в свою очередь, приводят к длительным событиям, убедитесь, что вы тщательно подумали о том, в каком потоке будут происходить эти изменения. Использование Задачи - большое изменение в том, как вы делаете разработку, но это действительно важная область для любого реального приложения Swing - найдите время, чтобы узнать об этом.

Е. Инъекция ресурсов важна. Используйте его с самого начала (вместо того, чтобы сообщать себе, что вы его добавите позже) - если вы вызываете setText() в JLabel, пришло время сесть и вызвать setName() вместо этого и добавить запись в ресурсы файл. JSR 296 делает это довольно легко сделать, если вас дисциплинируют.

Я думаю, что достаточно на этот раз - это очень сложный предмет с множеством нюансов. Я провел последние 7-8 лет, ударяя головой в вещи, которые не работают, и я постоянно нахожу лучшие способы делать даже то, что хорошо работает для меня.

Ответ 2

В учебнике по Java есть Swing-трейл, который очень хорош для правильного понимания понятий.

Если вы привыкли к веб-приложениям, вы обнаружите, что GUI-модель довольно запутанна, пока у вас нет этого.

http://java.sun.com/docs/books/tutorial/uiswing/

Ответ 3

Мартин Фаулер начал разработку своей книги по архитектуре корпоративных приложений, охватывающей некоторые шаблоны, которые не были включены в оригинальную книгу, в том числе шаблоны графического интерфейса.

Хотя его содержимое не является исключительно ориентированным на Java, они очень ценны.

Ответ 4

Вы можете попробовать Spring Проект Rich Client. У меня очень хороший опыт работы с остальной частью портфеля spring.

Ответ 5

Еще одно очень простое, очень простое представление об этом:

http://www.macs.hw.ac.uk/guidebook/?name=Using%20The%20GUI&page=1

Я не уверен, что мне нравится идея самого контроллера, реализующего ActionListener - с другой стороны, если бы это было не так, мне понадобился бы дополнительный класс для этого, который снова должен был бы знать контроллер и расскажи ему что-нибудь...

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