13

言い換えれば、Batik で Swing でできることと同じようなことを JavaFX でやろうとしているのです。

Node.snapshot()と同じように、JavaFX UI で任意のノードの外観をキャプチャできるようにしたいのですが、ラスター イメージではなく、SVG のようなベクター形式のイメージが必要です。(そして、ノードのラスター スナップショットを SVG イメージに挿入するだけでは十分ではありません。適切でスケーラブルなベクター イメージである必要があります。)

これは長期的なプロジェクトなので、独自のGraphicsContextを実装したり、JavaFX のリテイン モード API に相当するものを実装したりするつもりです。

これを行う方法があるかどうか誰かが知っていますか?私がやりたいことはJavaFXでも可能ですか?

4

5 に答える 5

5

Shape ジオメトリのみを変換する Gerrit Grunwald から ShapeConverter を「拡張」する JavaFx ノードから SVG へのコンバーターの作成を開始しました。

https://github.com/stefaneidelloth/JavaFxNodeToSvg

...そして、ある程度の欲求不満の後、それを止めました。

改善、機能追加、バグ修正はお気軽にどうぞ。

コンバーターは単純なノードの例では機能しますが、チャートなどの高度な例では失敗します。私の失敗したコンバーターが出発点になるかもしれません。現在の状態を次の図に示します。左側は元の JavaFx ノードを示し、右側は結果の svg 出力を示しています。

簡単なノードの例 (動作): ここに画像の説明を入力

チャートの例 (機能しません): ここに画像の説明を入力

対応する svg ファイルは次の場所にあります。

https://github.com/stefaneidelloth/JavaFxNodeToSvg/tree/master/output

その他の注意事項

上記のチャートの例で示されている配置の問題に加えて、さらにいくつかの問題を考慮する必要があります。

JavaFx は、SVG 標準要素よりも多くの CSS 機能を提供します。たとえば、(長方形の) JavaFx Region は、4 つの境界線のそれぞれに個別の線スタイルを持つことができます。このような Region は、単純に SVG rect に変換することはできません。代わりに、Region の 4 つの境界線を個別に描画する必要があります。さらに、そのような境界線の各端部は、垂直方向の半径と水平方向の半径の 2 つの個別のエッジ半径を持つことができます。「4 つの」境界線を対応する SVG 線に変換するには、境界線をさらに分割する必要がある場合があります。4 つの境界線のそれぞれについて、2 つの丸い部分と直線部分を描画します。したがって、場合によっては、単一の JavaFx 領域の境界を描画するために 12 個の SVG パス要素が存在することがあります。加えて、領域の背景の塗りつぶしは、領域の境界とは異なる半径を持つことができます。Region の背景を描画するには、さらに SVG 要素が必要になる場合があります。したがって、「長方形の領域」の変換でさえ、非常に複雑になる可能性があります。

JavaFx ノードがアニメートされる場合があることにも注意してください。たとえば、線の不透明度は最初は 0 で、数ミリ秒後に別の値にフェードします。

FadeTransition ft = new FadeTransition(Duration.millis(250), borderline);
                    ft.setToValue(0);                       
                    ft.play();

したがって、アニメーションが無効になっているノードを変換するか、ノードが安定した状態になるまで待つことだけが理にかなっています。

JavaFx Charts の変換がいつの日かうまくいき、私のプロジェクトの 1 つで SVG エクスポートを使用して JavaFx プロットを使用できるようになれば、とてもうれしいです。

コンバーターの開発は当面中止し、代わりに JavaScript ライブラリー (d3) でプロットと SVG エクスポートを調査することにしました。その戦略がさらに悪いことが判明した場合は、JavaFxNodeToSvgConverter に戻るかもしれません。

編集 d3.js を使用したプロットは非常にうまく機能し、プロット/svg 作成の目的で JavaFx を使用しないことにしました。 https://github.com/stefaneidelloth/javafx-d3

于 2015-09-09T18:22:40.453 に答える
1

JFX JIRA には未解決のバグ リクエストがあります。

https://javafx-jira.kenai.com/browse/RT-38559

(登録が必要です。その問題に投票できます)。それは現在言う

将来のバージョンを検討してください。

バージョン 9 用にマークされています。

于 2015-02-06T10:40:13.793 に答える
1

単純なJavaFX 形状から SVG 文字列へのコンバーターがあります。CSS が適用されていない基本的な形状のみが変換され、任意のノードでは変換されませんが、おそらくそれだけで十分です。

于 2012-12-04T10:52:56.473 に答える
0

JavaFX ノードのツリー構造を一連の Graphics2D 命令に変換できる場合、Graphics2D ドライバーを備えた Batik を使用できるという考えです。

問題は、JavaFX ツリー構造を Graphics2D オーダーに変換することは、(ノードの CSS プロパティを処理したとしても) 思っているほど難しくないということです。

一部の読者は、ライブラリへのリンクとその動作中の写真だけでなく、いくつかのコードを含める必要があると提案しました。実行するのはそれほど難しくありませんが、それでも 5000 行のコードがあるためです。

変換の実行方法:

  • SVG に変換するには Graphics2D が必要です (たとえば、Batik SVGGraphics2D クラス)。
  • JavaFX 構造を反復処理します。
  • 構造内の各ノードに対して、最初にこのノードの現在の javaFX 変換を AffineTransform に変換し、その変換をノードに適用します (ノードの最後で最初の AffineTransform に確実に戻すには、スタックで実行する必要があります)。 );
  • ノードごとに、適切な Graphics2D オーダーに変換する必要があります。

多くの Node タイプをサポートする必要はないことに注意してください。主に:

  • リージョン (コントロールは、関連付けられたグラフィックを持つことができる特別なタイプのリージョンです)
  • グループ
  • 形状 (テキスト、長方形など)
  • 画像の ImageView

Graphics2D で関連付けられたクリッピングを適用するために、ノード クリッピングを処理する必要がある場合もあります。

また、ノードの CSS プロパティにも注意する必要があります。

そのすべての価値のために、私が使用したライブラリ(このアルゴリズムを適用する)はここにあります:http://sourceforge.net/projects/jfxconverter/

于 2016-04-19T22:07:02.510 に答える