Вопросы: управление Swing GUI из внешнего класса и отделение логики от пользовательского интерфейса - PullRequest
4 голосов
/ 05 июня 2011

ОБНОВЛЕНИЕ: я использую Netbeans и Matise, и вполне возможно, что это может быть Matise, вызывая проблемы, которые я опишу ниже.

ОБНОВЛЕНИЕ 2: Спасибо тем, кто предложил конструктивные предложения.После переписывания кода без помощи Матиза ответ, предложенный ignis , работал так, как он описал.Я до сих пор не уверен, как помешал генератору кода Netbeans код.

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

В частности, я хочуэти выходные данные начинают отображаться при запуске, а также запускаются и останавливаются в зависимости от внешних условий, которые не имеют ничего общего с графическим интерфейсом пользователя или действиями пользователя.Из того, что я понимаю, вы можете инициировать такие события с помощью прослушивателей действий, но эти прослушиватели действий предполагают, что они прослушивают действия пользователя.Если я должен использовать слушателей действия, есть ли способ обмануть GUI, заставляя думать, что взаимодействие с пользователем произошло, или есть более простой способ достичь того, что я хочу сделать?

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

Ответы [ 3 ]

3 голосов
/ 05 июня 2011

Нет необходимости использовать слушателей. Объекты GUI такие же, как и любые другие объекты в программе, поэтому на самом деле

  1. вы можете использовать шаблон слушателя в любой части программы, даже если он не связан с GUI
  2. Вы можете вызывать методы объектов графического интерфейса в любое время, когда захотите во время выполнения программы, даже если вы не присоединяете никаких слушателей к объектам в графическом интерфейсе.

Основное «правило», которому вы должны следовать, заключается в том, что каждый вызов метода, выполняемый над объектами графического интерфейса, должен выполняться в потоке диспетчеризации событий AWT (да, это верно и для Swing).

http://download.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html

Таким образом, вы должны заключить код, обращающийся к объектам графического интерфейса пользователя, либо в

javax.swing.SwingUtilities.invokeLater( new Runnable() { ... } )

или

javax.swing.SwingUtilities.invokeAndWait( new Runnable() { ... } )

http://download.oracle.com/javase/6/docs/api/javax/swing/SwingUtilities.html


О "отделении кода GUI от логики приложения": google "MVC" или "контроллер представления модели". Это «стандартный» способ разделения этих вещей. Он состоит в том, чтобы сделать код GUI («представление») просто «фасадом» для содержимого («модель»). Другая часть приложения («контроллер») создает и вызывает модель и представление по мере необходимости (она «контролирует» выполнение программы или должна делать это, поэтому она называется «контроллер») и связывает их друг с другом .

http://download.oracle.com/javase/tutorial/uiswing/components/model.html

Например, класс JFoo в пакете javax.swing, который определяет компонент Swing, действует как представление для одного или нескольких классов FooModel или интерфейса, определенного либо в javax.swing, либо в одном из его подпакетов. Ваша программа будет «контроллером», который правильно создает представление и реализацию модели (которая может быть одной из реализаций по умолчанию, найденных в упомянутых мной пакетах, или пользовательской реализацией, определенной среди ваших пользовательских пакетов в программе).

http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/package-summary.html

1 голос
/ 05 июня 2011

Это действительно хороший вопрос, ИМХО ... тот, который я задал пару лет назад на Java-форумах Sun (теперь, по сути, несуществующий, спасибо Oracle, полуразумной группе фебрильных фискальных фашистов).

На фронте наведения порядка в Каосе, который является вашим типичным «первым вариантом» GUI, Google для Swing MVC. Первая статья, которую я прочитал на эту тему, была JavaWorld "MVC встречает Swing" . Мне повезло, потому что он объясняет ПРОБЛЕМЫ, а также предлагает здравые решения (с примерами). Прочитайте его, и Google для себя "расширенное чтение" и задайте нам любые конкретные вопросы, вытекающие из этого.

В области "симулированной пользовательской активности" вам не о чем беспокоиться ... вам нужно только наблюдать за внешними условиями, скажем, вы обнаруживаете, что локальный файл обновлен (например) и, в свою очередь, " выдать "уведомление зарегистрированному слушателю (ям) ... единственное отличие состоит в том, что в этом случае вы реализуете и" говорящего ", и" слушателя ". Интерфейс Swings Listener может быть повторно использован для обмена сообщениями (или нет, по вашему усмотрению). Здесь нет ничего хитрого.

«Поднять» «событие» совершенно прямо. По сути, вы просто вызываете метод «EventHappened» для каждого из слушателей, которые в данный момент зарегистрированы. Единственный сложный момент - иметь дело с «многопоточностью», присущей всем нетривиальным приложениям Swing ... в противном случае они будут работать как трёхногие собаки, потому что EDT (google it) постоянно отключается, делая все вместо просто рисование и посредничество в сообщениях (то есть для чего оно было разработано). (Как сказал ранее Игнис) Класс SwingUtilies предоставляет несколько удобных invoke методов для «вызова событий» в EDT.

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

Приветствия. Кит.

0 голосов
/ 05 июня 2011

Это не совсем отвечает на ваш вопрос, но вы можете быть заинтересованы в использовании Netbeans для разработки Java GUI. Вы можете использовать GUI в Netbeans для разработки Java GUI.

Вот хорошее место для начала - http://netbeans.org/kb/trails/matisse.html

...