当前位置: 首页 > 知识库问答 >
问题:

调用JavaFX应用程序两次

乌璞瑜
2023-03-14

我需要以下方面的帮助:我正在javafx中实现一个应用程序,这个应用程序是通过单击按钮调用的。问题是当我关闭应用程序时,我不能再次调用它。我读到过你不能多次调用Application.launch()方法。但是我在服务类上发现了一些东西。留档页面中的示例不是很清楚。有人知道如何做到这一点吗?谢谢。

http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm

我的代码:

private void jButton1ActionPerformed (java.awt.event.ActionEvent evt) {

      WebMap n1 = new WebMap () / / application in javafx

      n1.Lunch ();
}

WebMap类://javafx应用程序

public void Lunch () {
     Application.launch ();
}

共有2个答案

章嘉致
2023-03-14

作为com.bitplan的提交人。javafx开源项目我可以向您介绍我们已经使用了一段时间的解决方案:

https://github.com/BITPlan/com.bitplan.javafx/blob/master/src/main/java/com/bitplan/javafx/WaitableApp.java

 WaitableApp.toolkitInit();

将初始化 JavaFX 环境。

https://github.com/BITPlan/com.bitplan.javafx/blob/master/src/main/java/com/bitplan/javafx/SampleApp.java

将显示WaitableApp基类的一般使用示例。您可能还想看看项目的JUnit测试用例。

WaitableApp

/**
 * Waitable Application that does not need launch
 * 
 * @author wf
 *
 */
public abstract class WaitableApp extends Application {
  protected Stage stage;
  static boolean toolkitStarted;

  /**
   * allow startup without launch
   */
  @SuppressWarnings("restriction")
  public static void toolkitInit() {
    if (!toolkitStarted) {
      toolkitStarted = true;
      // do not exit on close of last window
      // https://stackoverflow.com/a/10217157/1497139
      Platform.setImplicitExit(false);
      /// https://stackoverflow.com/a/38883432/1497139
      // http://www.programcreek.com/java-api-examples/index.php?api=com.sun.javafx.application.PlatformImpl
      com.sun.javafx.application.PlatformImpl.startup(() -> {
      });
    }
  }

  @Override
  public void start(Stage stage) {
    this.stage = stage;
  }

  public Stage getStage() {
    return stage;
  }

  public void setStage(Stage stage) {
    this.stage = stage;
  }

  /**
   * wait for close
   * 
   * @throws InterruptedException
   */
  public void waitStatus(boolean open) {
    int sleep = 1000 / 50; // human eye reaction time
    try {
      if (open)
        while ((stage == null) || (!stage.isShowing())) {
          Thread.sleep(sleep);
        }
      else
        while (stage != null && stage.isShowing()) {
          Thread.sleep(sleep);
        }
    } catch (InterruptedException e) {
      ErrorHandler.handle(e);
    }
  }

  public void waitOpen() {
    waitStatus(true);
  }

  public void waitClose() {
    waitStatus(false);
  }

  /**
   * show me
   */
  public void show() {
    // ignore multiple calls
    if (stage != null)
      return;
    Platform.runLater(() -> {
      try {
        this.start(new Stage());
      } catch (Exception e) {
        ErrorHandler.handle(e);
      }
    });
  }

  /**
   * close this display
   */
  public void close() {
    Platform.runLater(() -> {
      if (stage != null)
        stage.close();
    });
    this.waitClose();
    // allow reopening
    stage = null;
  }
}
宣胜
2023-03-14

您不能在同一进程中多次启动JavaFX应用程序,因此不要尝试这样做。

你需要找到一种替代机制来做任何你想做的事情。

如果要在Swing应用程序中嵌入JavaFX场景,应该在Swing中创建新的JFXPanels,而不是在Swing按钮上创建新的JavaFX应用程序

如果您打算使用纯JavaFX应用程序,则无需使用启动JavaFX程序的Swing按钮,您只需使用JavaFX按钮即可直接显示JavaFX场景。

在这种情况下不需要使用Service,Service用于在另一个线程上执行重复的后台任务,这与您尝试的内容无关。

如果您想集成Swing和JavaFX应用程序,请阅读JavaFX for Swing开发人员。

 类似资料:
  • 问题内容: 由于fxml- files使用Controller类来处理事件,因此如何混淆JavaFX应用程序?当混淆的conntroller类具有不同的名称和路径时,fxml文件将找不到它们。 混淆后编辑fxml文件不是我想要的解决方案。 还有其他选择吗? 问题答案: 没有意义重塑轮子; 快速的google搜索产生了这个网站。 它使用Proguard混淆器。

  • 是否可以使用JavaFX更改应用程序图标,还是必须使用Swing来完成?

  • 问题内容: 我试图混淆我的JavaFX应用程序,但失败了。生成的结果不起作用,我不明白为什么。最终的jar失败了,因为fxml文件无法再加载所有导入(ClassNotFoundException)。 部署工作流程: 生成可运行的jar(在IntelliJ知识中作为工件) 用ProGuard混淆那个罐子 修复ProGuard无法执行的那个jar中的一些问题 1)最小示例应用 示例应用程序“ Guar

  • 我试图混淆我的JavaFX应用程序,但它失败了。生成的结果不工作,我不明白为什么。由于fxml文件无法加载所有导入(ClassNotFoundException),因此生成的jar会失败。 null null 现在结构看起来是这样的: sample.fxml文件现在如下所示: 现在这个罐子应该真的又能工作了,因为一切又正常了。但事实并非如此!fxml加载程序无法加载CustomControl(现在

  • 我正在开发一个java应用程序,其中我使用java swing窗体和javafx FXML stage,我对javafx是新手,现在我在应用程序中调用具有控制器的javafx FXML stage,从swing窗体调用FXML stage,单击如下按钮----application.launch(myfxml.class); 下面的代码片段用于调用swing表单-- 我得到的异常是“应用程序启动必

  • 问题内容: 我正在尝试使用Gradle构建相对简单的JavaFX应用程序。但是,我不知道该怎么做。 我是Gradle的新手,对于简单的(非javafx)项目,我已经成功使用了插件,并构建和打包了库和命令行应用程序。 但是,关于JavaFX,我完全陷入困境。我已经阅读了这篇文章,该文章建议使用该插件,但是我只能找到该插件的源代码,但是没有关于如何实际使用它的文档(在文章中,他们只是从远程URL应用它