我想扩展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());
}
}
答案 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);
}
仍然想知道为什么你的实现不起作用,因为它看起来不错。