如何扩展JavaFX Line或其他形状

时间:2017-03-08 13:54:22

标签: java javafx line

我想扩展JavaFX类Line,因为我希望起点和终点是一个圆圈或箭头或者某个。像那样。除此之外,我想在将来标记该行。 问题是如何覆盖绘制方法?什么方法负责画线,我该如何实现我的愿望? 到现在为止,我得到了,但是如果我安装了一条线,它就不会改变外观:

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());
    }

}

3 个答案:

答案 0 :(得分:0)

请注意,如果,例如,您提供的实施将无效。你要做什么

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

实际上很难使用子类化Line的策略来解决这个问题。

无论如何,通过委托私有本地对等类来呈现Shape,在我看来,它允许在许多情况下由硬件图形管道高效地呈现它们。因此,没有可访问的“绘画”方法供您在此处覆盖。

相反,子类Group并让你的子类包装一行(基本上,这是来自Joshua Bloch的 Effective 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));

另请注意,上面的实现实际上没有向Group添加任何状态或行为,因此您可以将其完全重构为方法:

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));

答案 1 :(得分:0)

据我所知,您不应该直接扩展基本形状。而是扩展Region并使用组合的Line作为子节点。

https://github.com/aalmiray/jsilhouette使用了类似的方法。属性设置为"类似于"形状但不是。

答案 2 :(得分: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);
}

仍然想知道为什么你的实现不起作用,因为它看起来不错。