java - 问题 : controlling a Swing GUI from an external class and separating logic from user interface

标签 java swing jtextfield

更新:我正在使用 Netbeans 和 Matise,可能是 Matise 导致了我在下面描述的问题。

更新 2:感谢那些提出建设性建议的人。在没有 Matise 帮助的情况下重写代码后,ignis 提供的答案如他所描述的那样起作用。我仍然不确定 Netbeans 代码生成器的代码是如何干扰的。

虽然我使用 Java 编程已有一段时间,但直到现在我还从未进行过任何 GUI 编程。我想在外部控制程序的某个部分(使用外部源的输出更新 jTextArea 字段),而不需要任何用户操作来触发 jTextArea 中此输出的显示。

具体来说,我希望此输出在启动时开始显示,并根据与 GUI 或用户正在执行的操作无关的外部条件启动和停止。到目前为止,据我了解,您可以通过 Action 监听器触发此类事件,但这些 Action 监听器假定他们正在监听用户 Activity 。如果我必须使用 Action 监听器,是否有办法让 GUI 认为用户交互已经发生,或者是否有更直接的方法来实现我想做的事情?

另外,我真的很想了解更多有关将 GUI 代码与应用程序逻辑分离的最佳实践。从我遇到的文档来看,GUI 开发似乎需要逻辑和用户界面的杂乱集成,而不是可以实现完全分离的 Web 应用程序。我会对这方面的任何线索非常感兴趣。

最佳答案

不需要使用监听器。 GUI 对象就像程序中的任何其他对象一样,所以实际上

  1. 您可以在程序的任何部分使用监听器模式,即使它与 GUI 无关
  2. 您可以在程序执行期间随时调用 GUI 对象的方法,即使您没有将任何监听器附加到 GUI 中的对象也是如此。

您必须遵循的主要“规则”是,对 GUI 对象执行的每个方法调用都必须在 AWT 事件调度线程上运行(是的,对于 Swing 也是如此)。

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

因此您必须将访问 GUI 对象的代码包装到其中一个

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 代码与应用程序逻辑分离”:谷歌“MVC”或“ Model View Controller ”。这是分离这些东西的“标准”方式。它包括使 GUI 代码(“ View ”)只是内容(“模型”)的“外观”。应用程序的另一部分(“ Controller ”)根据需要创建和调用模型和 View (它“控制”程序执行,或者它应该这样做,所以它被命名为“ Controller ”),并将它们相互连接.

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

例如,javax.swing 包中的一个 JFoo 类定义了一个 Swing 组件,它充当一个或多个 FooModel 类或在 javax.swing 或其子包之一下定义的接口(interface)的 View 。您的程序将是正确实例化 View 和模型实现的“ Controller ”(这可能是我提到的那些包下的默认实现之一,或者是程序中自定义包中定义的自定义实现)。

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

关于java - 问题 : controlling a Swing GUI from an external class and separating logic from user interface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6241177/

相关文章:

java - NoSql 数据库是否有任何 JDBC 实现?

java - 如何在 java 中将字符串子串到最后一个点 (.) 之前?

java - GridBagLayout 面板扩展忽略 BoxLayout 的垂直粘合

java - 查找已调用弹出菜单的 JTable 行

java - 更改 JTextfield 的监听器

java - 如何在 Java 中以字符串形式获取 XML 节点内的内容

java - URL 的 Json 响应太大

swing:适用于JTextField更改事件的监听器

java - JTextField 监听器在文本更改时修改 textField 的文本

java - 将外来字符(希腊语)转换为英语字符。