Уровень графического интерфейса против кода уровня против Swing - PullRequest
4 голосов
/ 09 августа 2010

Я всегда программировал консольные приложения и изучал некоторые базовые навыки UML / шаблонов, используя C ++.

Теперь я решил перейти на Java и добавить GUI в свои программы.

Первый вопрос:как обрабатывать слой GUI в программе desing.Я имею в виду, как я должен отделить весь код GUI (добавление компонентов, базовую обработку событий) с кодом, который действительно выполняет свою работу (скажем, при нажатии какой-либо кнопки).

Другой вопрос, связанный с EDT,Я читал, что (почти) все компоненты Swing должны работать в одном потоке (обычно EDT), потому что они не являются поточно-ориентированными.Поэтому я подумал, что если «тяжелый код» вызывается из (например) ActionListener, то графический интерфейс станет безразличным в течение некоторого времени, пока не закончится этот «тяжелый код».

Это довольно нежелательно, поэтому яЯ думаю, что естественное решение состоит в том, чтобы запустить тяжелый код, возможно, в другом потоке или сделать что-то подобное (я знаю, что это нужно делать осторожно, потому что я больше не мог предположить, что после того, как пользователь нажал кнопку, «глубокое действие»)выполняется до обработки другого события GUI).

Итак, как вы видите, у меня много вопросов о том, как включить GUI в мои шаблоны, чтобы сохранить все достаточно независимыми и легко поддерживаемыми;и некоторые вопросы об особенностях компонентов Swing и отзывчивости.

Ответы [ 2 ]

3 голосов
/ 09 августа 2010

Повторное отделение бизнес-логики от GUI: Если вы намереваетесь использовать Swing, прежде всего изучите шаблон проектирования Model-View-Controller .Это хороший шаблон для разделения проблем, и Swing в большой степени полагается на него.

Re усиленный код и EDT: используйте SwingUtilities , или даже лучше, SwingWorkers .

1 голос
/ 09 августа 2010

Вы найдете Swing, уже в значительной степени структурированный в вариант MVC, который они называют view-Delegate.
Что вам нужно сделать, это решить, сколько логики приложения входит в уровень GUI, и всегда есть некоторые.Одна вещь, которая помогает, состоит в том, что, если действие графического интерфейса пользователя предназначено для выполнения важной задачи, такой как обновление некоторых данных в базе данных, то убедитесь, что существует простой вызов, который может вызывать обработчик действия графического интерфейса пользователя, который не имеет ничего общего с графическим интерфейсом.код / ​​структура.Это может быть реализовано с помощью Projects в вашей IDE, которые имеют одностороннюю зависимость.Например, храните весь свой код GUI в проекте «gui», который зависит от вашего «общего» проекта.«Общий» проект сможет выполнять бизнес-логику, но не будет импортировать свинг-виджеты и не сможет увидеть ваш «графический интерфейс».

Хорошо, что вы определили EDT как ключевую проблему проектирования- потому что это так.LBT уже предложил SwingWorker, который является хорошим способом управления долгосрочными задачами графического интерфейса в отдельном потоке.

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