将JavaFX 8与JSF 2.2集成

时间:2016-12-15 07:15:15

标签: jsf javafx

作为一项实验,我在尝试将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?必须有人试过这个,我最欣赏一些解决这个问题的想法。

0 个答案:

没有答案