11

これは奇妙に聞こえるかもしれませんが、JavaFX を使用してサーバー側でグラフ イメージを生成したいと考えています。JavaFX には、画像変換の結合と配置を実行するための優れたキャンバス API があるためです。

特に、チャートを画像として生成するための春の MVC サービスがあります。主な問題は、便利な Spring Bean から javaFX API を呼び出す方法です。Javaアプリケーションからjavafxコードを実行しようとすると(javaFXアプリケーションクラスを拡張しない)、

java.lang.IllegalStateException: Toolkit not initialized

この問題を解決するための提案/アイデアはありますか?

4

3 に答える 3

3

他の人がこれを探している場合、これははるかに簡単な方法です。JavaFX 2.2 を使用して、次の操作を実行できました。

    waitForInit = new Semaphore(0);
    root = new Group();
    root.getChildren().add(jfxnode);
    FxPlatformExecutor.runOnFxApplication(() -> {
        snapshot = jfxnode.snapshot(new SnapshotParameters(), null);
        waitForInit.release();
    });

    waitForInit.acquireUninterruptibly();
    BufferedImage bi = SwingFXUtils.fromFXImage(snapshot, null);

ノードをグループに追加する必要はありません。そこから、画像に対して必要な操作を行うことができます。

FxPlatformExecutor は、プロジェクトで使用している JME3-JFX ライブラリからのものです。参照: https://github.com/empirephoenix/JME3-JFX/blob/master/src/main/java/com/jme3x/jfx/FxPlatformExecutor.java

メソッドを簡単に作成しrunOnFxApplication()たり、FxPlatformExecutor クラスを作成したりできます。

これがコードです。

package com.jme3x.jfx;

import javafx.application.Platform;

/**
 * TODO This Class should be replaced by some Workmanager implemntation
 * in the future
 * @author Heist
 */
public class FxPlatformExecutor {

    public static void runOnFxApplication(Runnable task) {
        if (Platform.isFxApplicationThread()) {
            task.run();
        } else {
            Platform.runLater(task);
        }
    }
}

このコードは私が書いたものではありません。github のリンクは上にあります。

于 2014-11-05T15:01:17.767 に答える
0

おそらく、このソリューションに似たものが役立つでしょうか?

JavaFX 2.1: ツールキットが初期化されていません

それ以外の場合は、サービスを作成し、イメージをデータストアにプッシュして、Spring アプリケーションで取得することを検討します。

少しでもお役に立てば幸いです。

于 2013-08-02T05:03:05.620 に答える