2017-03-08 10 views
1

JavaFXクラスを拡張したいのですが、開始点と終了点を円または矢印またはsthにしたいからです。そうですね。それに加えて、私は将来のラインにタグを付けることを望みます。 問題は、ペイント方法を上書きする方法ですか?どのような方法で線を描くのですか?私の望みをどのように実装する必要がありますか?あなたが提供される実装は、例えば、場合は動作しないことがJavaFXの線またはその他の図形を拡張する方法

import javafx.scene.shape.Circle; 
import javafx.scene.shape.Line; 

public class LabeledLine extends Line { 
    private Circle startCircle; 
    private Circle endCircle; 

    public LabeledLine(){ 
     super(); 
     startCircle = new Circle(getStartX(), getStartY(), 10); 
     endCircle = new Circle(getEndX(), getEndY(), 10); 
     startCircle.setFill(getFill()); 
     endCircle.setFill(getFill()); 
    } 


    public LabeledLine(double startX, double startY, double endX, double endY){ 
     super(startX, startY, endX, endY); 
     startCircle = new Circle(getStartX(), getStartY(), 10); 
     endCircle = new Circle(getEndX(), getEndY(), 10); 
     startCircle.setFill(getFill()); 
     endCircle.setFill(getFill()); 
    } 

} 

答えて

0

注: 今まで、私はラインをinstaciate場合、それはdoesn't外観を変更することが、得ましたあなたは

LabeledLine l = new LabeledLine() ; 
l.setStartX(100); 

サブクラス化Lineの戦略を使用して、この問題を解決するために、実際には非常に困難であるやっていました。

いずれにせよ、Shapeはプライベートネイティブピアクラスに委譲することでレンダリングされます。これは(わかっているように)多くの場合ハードウェアグラフィックスパイプラインによって非常に効率的にレンダリングできるようにします。したがって、ここでオーバーライドするためのアクセシブルな「ペイント」メソッドはありません。

代わりに、サブクラスGroupとあなたのサブクラスは(基本的に、これはジョシュアブロッホ効果的なJavaのから「相続上の組成を好む」される)行をラップしてみましょう:

public class LabeledLine extends Group { 

    public LabeledLine(Line line) { 
     Circle startCircle = new Circle(10); 
     startCircle.centerXProperty().bind(line.startXProperty()); 
     startCircle.centerYProperty().bind(line.startYProperty()); 
     startCircle.fillProperty().bind(line.fillProperty()); 
     Circle endCircle = new Circle(10); 
     endCircle.centerXProperty().bind(line.endXProperty()); 
     endCircle.centerYProperty().bind(line.endYProperty()); 
     endCircle.fillProperty().bind(line.fillProperty()); 

     getChildren().addAll(line, startCircle, endCircle); 
    } 
} 

あなたはその後、としてこれを使用します。

Line line = new Line(); 
Pane somePane = new Pane(); 
somePane.getChildren().add(new LabeledLine(line)); 

注意も実際に上記の実装は、への状態や動作を追加していないこと、あなたが完全にメソッドとしてそれをリファクタリングできるよう:あなたが直接、基本形状を拡張するべきではありません

public Group labelLine(Line line) { 
    Circle startCircle = new Circle(10); 
    startCircle.centerXProperty().bind(line.startXProperty()); 
    startCircle.centerYProperty().bind(line.startYProperty()); 
    startCircle.fillProperty().bind(line.fillProperty()); 
    Circle endCircle = new Circle(10); 
    endCircle.centerXProperty().bind(line.endXProperty()); 
    endCircle.centerYProperty().bind(line.endYProperty()); 
    endCircle.fillProperty().bind(line.fillProperty()); 

    return new Group(line, startCircle, endCircle); 
} 

、その後

Pane somePane = new Pane(); 
Line line = new Line(); 
somePane.getChildren().add(labelLine(line)); 
+0

実装を試しましたか?彼らはかなりよく見えますが、なぜ彼らは働かないのでしょうか。私がこれを実行すると、私が見ているのはちょうど正常な線です... – jaaBeg16

0

私の知る限り。むしろRegionを拡張し、子ノードとして構成済みLineを使用してください。

https://github.com/aalmiray/jsilhouetteも同様のアプローチを使用します。プロパティは「シェイプのように見える」タイプで設定されますが、そうではありません。

0

私はここでこれを試みたが、それがうまく働いた:あなたの実装では動作しませんなぜそれが良さそうに見えますので

public Group labelLine(Line line) { 
    Circle startCircle = new Circle(line.getStartX(), line.getStartY(), 10); 
    Circle endCircle = new Circle(line.getEndX(), line.getEndY(), 10); 

    return new Group(line, startCircle, endCircle); 
} 

はまだ、wonderin。

関連する問題