2016-04-13 7 views
1

私は、JavaFX Polylineとしてレンダリングしたいが、ストローク内に複数の色を使用してレンダリングしたいシェイプを持っています。本質的には、8ピクセル幅の青色の線で、その両側に2ピクセル幅の黒い境界線があります。それは私が望むようにレンダリングしている間、私は今GroupではなくPolylineを持っているので、私ができる、JavaFXポリラインのストロークをカスタマイズする

Group group = new Group(); 
double[] coords = ... 

Polyline bg = new Polyline(coords); 
bg.setStroke(Color.BLACK); 
bg.setStrokeWidth(12); 

Polyline fg = new Polyline(coords); 
fg.setStroke(Color.BLUE); 
fg.setStrokeWidth(8); 

group.getChildren().add(bg); 
group.getChildren().add(fg); 

ので:私はGroupを作成し、その後Groupに2 Polylinesを追加することによって、同じ効果を得ることができますそれをShapeとして扱いません。私はカスタム描画メカニズムを指定する方法がないので、これを行う方法はありますか?

+0

この[質問](http://stackoverflow.com/questions/28764190/javafx-line-fill-color/28765099#28765099)を確認してください。ポリラインを線の集まりに変換し、同じソリューションを適用することができます。しかし、結合でレンダリングの問題が発生します。 –

+0

私の目標は、単一のポリラインノードにとどまることだとすれば、そのアプローチは機能しません。私は、ノードを他のノードに分割することや、別のタイプのノードを使用してそれをレンダリングすることを伴わないソリューションが必要です。明確にするために、答えが「それは不可能」であれば、私の要求に合わない解決策を取るよりも、そのことを聞いてみたいと思います。 – ctg

答えて

1

全体として、私はあなたの質問で概説したグループベースのアプローチが好きです。それはあなたの特定の状況に合っていないことは残念ですが、この質問に遭遇する他の人にとっては、そのアプリケーションのための好ましい解決策かもしれません。


あなたは、境界線の色を生成するためにあなたのPolyLineDropShadow効果を適用することができます。これは、あなたが望むかもしれないし、そうでないかもしれない角のために少し丸みを帯びた端で終わるでしょう。

polyline

import javafx.application.Application; 
import javafx.scene.*; 
import javafx.scene.effect.*; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Polyline; 
import javafx.stage.Stage; 

public class Polyanna extends Application { 
    @Override 
    public void start(Stage stage) { 
     Polyline polyline = new Polyline(); 
     polyline.getPoints().addAll(50.0, 50.0, 
       200.0, 100.0, 
       100.0, 200.0 
     ); 
     polyline.setStrokeWidth(8); 
     DropShadow borderEffect = new DropShadow(
       BlurType.THREE_PASS_BOX, Color.BLUE, 2, 1, 0, 0 
     ); 
     polyline.setEffect(borderEffect); 

     stage.setScene(
       new Scene(
         new Group(polyline), 
         250, 250 
       ) 
     ); 
     stage.show(); 
    } 

    public static void main(String\[\] args) { 
     launch(args); 
    } 
} 

別のオプションは、塗りと線ではなくポリラインでPolygonを描くことです。あなたは、ポリラインのポイントの配列を取得し、作成するshape intersection capabilitiesを使用することができ、作業;-)


のビットで(すなわち、入力アレイからポリゴンの点のマッチング配列を生成するルーチンを書くことができあなたが記入してストロークすることができる任意の形状は、あなたが望むものに最も近い何かを得る最も簡単な方法で終わる可能性があります。このアプローチでは、境界線の色の線の線のキャップ、マイターリング、線の結合の設定などをプログラムで制御できます。

shape intersect

import javafx.application.Application; 
import javafx.scene.*; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.*; 
import javafx.stage.Stage; 

public class PolyIntersect extends Application { 
    private static final double W = 250; 
    private static final double H = 250; 

    @Override 
    public void start(Stage stage) { 
     Polyline polyline = new Polyline(); 
     polyline.getPoints().addAll(50.0, 50.0, 
       200.0, 100.0, 
       100.0, 200.0 
     ); 
     polyline.setStrokeWidth(8); 
     Rectangle bg = new Rectangle(0, 0, W, H); 
     Shape shape = Shape.intersect(bg, polyline); 
     shape.setFill(Color.BLACK); 
     shape.setStroke(Color.BLUE); 
     shape.setStrokeType(StrokeType.OUTSIDE); 
     shape.setStrokeWidth(2); 

     stage.setScene(
       new Scene(
         new Group(shape), 
         W, H 
       ) 
     ); 
     stage.setResizable(false); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

DropShadowはまさに私が探していたものです。ありがとう! – ctg

関連する問題