【问题标题】:JFrame waiting for data reception to perform its taskJFrame 等待数据接收执行其任务
【发布时间】:2016-09-19 08:56:38
【问题描述】:

我有两个不同且独立的JFrame窗口:

  1. DataFrame
  2. GraphFrame

第一个是供用户操作的,输入不同的值和模式以显示在 2) 中呈现的图表上。 1) 将特定值发送到 2)(双精度数组),以便“GraphFrame”可以创建图形。

我在DataFrame的“main”方法中调用GraphFrame的“main”方法,使它们同时运行,并且在整个过程中都是可见的。

我希望这些框架是完全独立的,这意味着 1) 的任务是发送值,而 2) 的任务是检查何时收到值,然后创建图表。

我也更喜欢将大部分方法保持为私有,这样就无法从外部源访问它们。

我的问题是,我不知道哪种方式是实现这种数据交换的最佳方式。 Frame 2) 的最佳方式是继续“倾听”它需要接收的值吗?

我是否应该在 2) 上创建 getter/setter 并在观察者 https://sourcemaking.com/design_patterns/observer 的帮助下创建?

或者我应该使用线程吗?

甚至创建一个不断等待值的传统循环,例如:

while(array.isEmpty()) {
     //stuck here
}
//create the graph from the values in array

目前我正在从 setter 方法接收 2) 中的值,但到目前为止,我无法在获得值后执行我想要的代码。

你认为最好的实现方式是什么?

P.S.:我是否应该考虑不从 DataFrame 调用 GraphFrame main 并分别运行这两个?

【问题讨论】:

  • “JFrame 等待数据接收以执行其任务” 将一帧转换为模态JDialogJOptionPane。在setVisible(true) 之后立即查询控件。该调用之后的代码语句只会在它关闭后继续执行。
  • 您好@AndrewThompson,我之前已经多次看到并阅读过该线程,并且我一直在使用布局来避免多个 JFrame。但是,对于我正在创建的内容,我需要这 2 个(并且只会是 2 个),因为“DataFrame”是模拟真实环境的,所以它主要用于测试“GraphFrame”。确实是要给人一种印象,即 2 个不同的应用程序,而不仅仅是一个。因此我的 P.S.在我的线程中。

标签: java swing jframe observer-pattern


【解决方案1】:

据我了解,您正试图在同一个应用程序中运行两个 JFrame。从概念上讲,这更像是 一个 UI 分成两个窗口,而不是像您所说的那样运行两个框架。

Swing 要求所有 UI 元素都由 一个 线程 - AWT 线程更新。与 UI 的交互也将在 AWT-Thread 中运行。您需要考虑到这一点。

此外,最好的做法是将数据模型和视图分开。要解决您的问题,您可以为 GraphFrame 创建一个模型,该模型由 DataFrame 上的更改操作。这些变化可以例如被模型上使用 SwingUtils.invokeLater() 更新 GraphFrame 的侦听器拾取。

当然,您可能还需要注意一些问题,根据您的要求,您可能需要进一步解耦这两个部分。

【讨论】:

  • 哦,好的。那么为了完成彼此独立的任务(这些框架),我应该将它们创建为两个不同的应用程序吗?这样他们就完全分开了。这样我怎么能在两者之间建立联系?另一方面,您建议使用 invokeLater() 方法,但我不明白它是如何工作的(抱歉,以前从未使用过)。
【解决方案2】:

您可以尝试让 GraphFrame 初始化然后停止,但在 GraphFrame 中有一个(静态/非静态)方法,DataFrame 可以调用该方法来更新图形。之后,重新绘制 GraphFrame。

这是你要找的吗?

【讨论】:

  • 确实有这个可能!但是,我需要一个选项,即 GraphFrame 中的图形必须实时更新或每 2 或 3 秒更新一次才能继续绘制它(而不是完全绘制整个图形)。有了这个,我需要每 2/3 秒更新一次图表,但我只想在 DataFrame 上“按下一个按钮”(做出一个动作),然后 GraphFrame 可以自己处理所有这些。
猜你喜欢
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 2014-08-17
  • 2019-09-08
  • 1970-01-01
相关资源
最近更新 更多