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

Одна из самых запоминающихся ошибок, которые у меня были, была связана со встроенной функцией, которая использовала alloca. Это проявилось как переполнение стека (потому что оно размещается в стеке) в случайных точках выполнения программы.

В заголовочном файле:

void DoSomething() {
   wchar_t* pStr = alloca(100);
   //......
}

В файле реализации:

void Process() {
   for (i = 0; i < 1000000; i++) {
     DoSomething();
   }
}

Итак, что случилось, это была встроенная функция компилятора DoSomething, и все выделения стека происходили внутри Process() функции и, таким образом, взорвать стек. В мою защиту (и я не был тем, кто обнаружил проблему; мне пришлось пойти и поплакаться с одним из старших разработчиков, когда я не мог это исправить), это было не прямо alloca, это было одно из Макросы преобразования строк ATL.

Итак, урок - не используйте alloca в функциях, которые, по вашему мнению, могут быть встроенными.

12
задан Henning 30 June 2009 в 14:07
поделиться

5 ответов

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

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

Я давно думал, что должна быть дискуссионная группа / вики / что-то, посвященное этому тема. Пока что я обнаружил, что listserv для различных полнофункциональных клиентских библиотек полезен, но не полон. Может быть, есть о чем подумать в свободное время: -)

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

Во-первых, некоторые абсолютно важные библиотеки, если вы собираетесь заниматься разработкой Swing. :

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

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

РЕДАКТИРОВАТЬ - с тех пор, как я написал это, я начал использовать GUTS в наших проектах (это фреймворк приложений на основе Guice - он начал свою жизнь как JSR 296, но имеет очень мало общего с этим сейчас). GUTS - еще молодой проект, но стоит взглянуть на него, если вы рассматриваете фреймворки.

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

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

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

Так что это ключевые, абсолютно необходимые библиотеки в моем книга.

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

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

B. Представления НЕ являются подклассами JPanel. Вместо этого я следую вдохновленной JGoodies технике работы с View как конструктором, создающим 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;
  }
}

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

C. Используйте Действия, а не обработчики событий. JSR 296 действительно хорошо справляется с задачей облегчения создания и работы с Action'ами.

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

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

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

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

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

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

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

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

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

14
ответ дан 2 December 2019 в 20:19
поделиться

В Java Tutorial есть Swing trail, который очень хорош для ясного понимания концепций.

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

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

1
ответ дан 2 December 2019 в 20:19
поделиться

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

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

1
ответ дан 2 December 2019 в 20:19
поделиться

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

0
ответ дан 2 December 2019 в 20:19
поделиться

Другой очень простой, очень простой способ показать это есть:

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

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

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

0
ответ дан 2 December 2019 в 20:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: