作为一项实验,我在尝试将JavaFX与JavaServer Faces 2.2集成时进行了一些测试。我正在使用Eclipse Mars.2版本4.5.2和Java 1.8,其中包括JavaFX 8,以及Windows 10计算机上的Glassfish 4.1.1服务器。我们的想法是看看是否可以在服务器上运行JSF应用程序并调用一些JavaFX GUI,最终目的是能够在客户端上显示3D图形。
但是,我遇到了一些问题,所以在这里展示一个非常简单的例子。 xhtml代码只是:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>Test of JavaFX with JSF</title>
</h:head>
<h:body>
<h1>Test of JavaFX with JSF</h1>
<h:form id="myForm" prependId="false">
<h:commandButton value="Launch JavaFX Application" actionListener="#{myBean.launchApp}" />
<br />
<h:commandButton value="Stop JavaFX Application" actionListener="#{myBean.stopApp}" />
</h:form>
</h:body>
</html>
只在localhost:8080/Test
的浏览器窗口中显示两个按钮,一个用于启动JavaFX应用程序,另一个用于关闭应用程序。
bean的代码是:
package shape3dfxjsf;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@SessionScoped
@ManagedBean(name="myBean")
public class MyBean implements Serializable {
private static final long serialVersionUID = 1L;
private static boolean launched = false;
public static void launchApp() {
if (launched) return;
launched = true;
TestJavaFX.main(null);
}
public static void stopApp() {
launched = false;
}
}
和JavaFX应用程序的代码,其中所有图形都被删除,只有屏幕是:
package shape3dfxjsf;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class TestJavaFX extends Application {
@Override
public void start(Stage primaryStage) {
try {
BorderPane root = new BorderPane();
Scene scene = new Scene(root,400,400);
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
当在服务器上使用JSF时,类MyBean调用类TestJavaFX的最后一个列表中的main()
方法,并且当作为Java应用程序运行时也可以直接调用它,这是一个有用的测试
当Glassfish启动并打开浏览器窗口时,我点击&#34;启动JavaFX应用程序&#34;按钮和MyBean中的launchApp()
方法被调用。由于已启动的标志最初为false,因此调用了TestJavaFX中的main()
方法,实际上我的屏幕上出现了一个JavaFX窗口,就像我直接从TestJavaFX调用main()
方法一样,这样就可以正常工作了
由于启动标志现在为true,再次单击启动按钮无效(可以在更高版本的代码中禁用该按钮)。关闭JavaFX窗口后,启动的标志仍然为true,因此&#34;停止JavaFX应用程序&#34;必须单击按钮才能再次将其设置为false以重新启用&#34;启动JavaFX应用程序&#34;。手动将标志设置为假的这个小问题可以很容易地自动化。
但是,主要问题是我无法重启JavaFX应用程序,即使它已经关闭了。如果我单击&#34;启动JavaFX应用程序&#34;重新启用后,JavaFX应用程序关闭后,我不断收到错误:
java.lang.IllegalStateException: Application launch must not be called more than once
我已经阅读了这篇文章并查看了其他帖子。问题是,据我所知,JavaFX已关闭,所以我不明白为什么我会收到此错误。在JavaTestFX类中尝试Platform.exit()
并不起作用,调用System.exit(0)
只会杀死所有内容。
如何在不关闭所有内容并重新开始的情况下从JSF bean调用JavaFX时重启JavaFX?必须有人试过这个,我最欣赏一些解决这个问题的想法。