Java Swing 核心与 GUI 分离

标签 java swing edt

我不明白如何将程序的核心部分与程序的 GUI 部分分开。事实上,网络上的所有示例都说任何 GUI 操作都必须使用 SwingUtilities.invokeLater() 方法执行。

问题是我不明白如何使用这种方法来处理我的 GUI 部分以及核心和 GUI 如何进行通信。

例如,我有一个负责某些计算的 GUI 显示的类:

public class GUI {
  private JFrame window;

  public GUI() {
    window = null;
  }

  public void createWindow(int width, int height) {
    window = new JFrame();
    ...
    window.setVisible(true);
  }

  public void displayResults(Calcul results) {
    /* Some Swing actions. */
  }
}

我有我的程序的核心:

public class Core {
  public static void main(String[] args) {
    GUI gui = new GUI();
    Calcul calculs = new Calcul();

    while (true) {
      /* Make some calculations. */
      /* Put results into calcul. */
      displayResults(calculs);
    }
  }
}

我知道这个架构并不理想,但我不得不使用它。我的问题是,我必须使用 EDT 来分离 GUI 部分和核心部分吗?而且,如果答案是肯定的,我该怎么做?

如果可能,我需要 EDT 调用对使用 GUI 类的用户是透明的。

编辑:

GUI 类的以下转换是否具有预期的行为?

public class GUI {
  private JFrame window;

  public GUI() {
    window = null;
  }

  public void createWindowEDT(final int width, final int height) {
    javax.swing.SwingUtilities.invokeLater(
      new Runnable() {
        public void run() {
          createWindow(width, height);
        }
      }
    );
  }

  private void createWindow(final int width, final int height) {
    window = new JFrame();
    ...
    window.setVisible(true);
  }

  public void displayResultsEDT(final Calcul results) {
    javax.swing.SwingUtilities.invokeLater(
      new Runnable() {
        public void run() {
          displayResultsEDT(results);
        }
      }
    );
  }

  private void displayResults(final Calcul results) {
    /* Some Swing actions. */
  }
}

最佳答案

您可以在您的 GUI 类中隐藏事件调度线程 (EDT) 的使用。鉴于 Swing 组件通常不是线程安全的,因此只有与 Swing 组件的交互才需要在 EDT 上进行。

GUI 类中不需要任何同步,因为只有主应用程序线程会调用 GUI.displayResults(Calcul),但如果这发生变化,您可能需要同步此方法或采取避免线程错误的其他步骤。

public class GUI
{
  ...

  public void displayResults(Calcul results) 
  {
    SwingUtils.invokeLater(
      new Runnable()
      {
        public void run()
        {
          /* Some Swing actions. */
        }
      }
    );
  }
}

关于Java Swing 核心与 GUI 分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15344560/

相关文章:

java - 主动渲染和 EDT(Swing 动画)

java - 有没有办法在 LARQ 中创建多个索引并对它们执行 SPARQL

java - 需要调整窗口大小才能使程序正常工作

java - 把按钮做成圆形

java - 显示为 null 的 UI 元素

java - 用于复杂类交互的Java Swing设计模式

python - scipy distance_transform_edt 函数如何工作?

java - 在本地计算机中克隆JUnit 5之后,在执行 “assemble”任务时编译时间错误

java - Api 21 上的工具栏项 MaterialButton 中的颜色错误

java - Android获取经纬度的方法