如何扩展JavaFX线条或其他形状
我想扩展JavaFX类行,因为我希望起点和终点是一个圆或箭头或类似的东西。除此之外,我想在将来标记这条线。 问题是如何覆盖绘制方法?什么样的方法负责划清界限?我必须如何实现我的愿望? 直到现在,我都知道了,但如果我安装一条线路,它不会改变外观:如何扩展JavaFX线条或其他形状,java,javafx,line,Java,Javafx,Line,我想扩展JavaFX类行,因为我希望起点和终点是一个圆或箭头或类似的东西。除此之外,我想在将来标记这条线。 问题是如何覆盖绘制方法?什么样的方法负责划清界限?我必须如何实现我的愿望? 直到现在,我都知道了,但如果我安装一条线路,它不会改变外观: import javafx.scene.shape.Circle; import javafx.scene.shape.Line; public class LabeledLine extends Line { private Circle s
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());
}
}
请注意,如果(例如)您要这样做,您提供的实现将不起作用
LabeledLine l = new LabeledLine() ;
l.setStartX(100);
实际上,使用子类化Line
的策略很难解决这个问题
无论如何,Shape
s是通过委托给私有的本机对等类来呈现的,这(据我所知)允许它们在许多情况下通过硬件图形管道高效地呈现。因此,这里没有可访问的“绘制”方法供您重写
相反,子类分组,并让子类包装一行(基本上,这是Joshua Bloch从有效Java中“偏爱组合而非继承”):
然后将其用作:
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));
请注意,如果(例如)您要这样做,您提供的实现将不起作用
LabeledLine l = new LabeledLine() ;
l.setStartX(100);
实际上,使用子类化Line
的策略很难解决这个问题
无论如何,Shape
s是通过委托给私有的本机对等类来呈现的,这(据我所知)允许它们在许多情况下通过硬件图形管道高效地呈现。因此,这里没有可访问的“绘制”方法供您重写
相反,子类分组,并让子类包装一行(基本上,这是Joshua Bloch从有效Java中“偏爱组合而非继承”):
然后将其用作:
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));
就我所知,你不应该直接扩展基本形状。而是扩展区域
,并使用组合的行
作为子节点
使用类似的方法。属性是在“看起来像”形状但不是的类型上设置的。据我所知,您不应该直接扩展基本形状。而是扩展区域
,并使用组合的行
作为子节点
使用类似的方法。属性是在“看起来像”形状但不是的类型上设置的。我在这里尝试了这个方法,效果很好:
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);
}
仍然想知道为什么您的实现无法工作,因为它看起来很不错。我在这里尝试了这个方法,效果很好:
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);
}
仍然想知道为什么您的实现不起作用,因为它看起来不错。您尝试过您的实现吗?它们看起来不错,但我不知道为什么不起作用。如果我运行这个,我看到的只是一个正常的行…延迟响应,但问题在于startCircle.fillProperty().bind(line.fillProperty())代码>和相应的端点绑定。直线的FillProperty为空,因此使圆不可见。如果设置了显式fillProperty,将fillProperty绑定到线条的strokeProperty,或者设置线条的fillProperty,应该可以正常工作。是否尝试了实现?它们看起来不错,但我不知道为什么不起作用。如果我运行这个,我看到的只是一个正常的行…延迟响应,但问题在于startCircle.fillProperty().bind(line.fillProperty())代码>和相应的端点绑定。直线的FillProperty为空,因此使圆不可见。如果设置显式fillProperty,将fillProperty绑定到线条的strokeProperty,或者设置线条的fillProperty,应该可以正常工作。请参阅上面的注释。该问题绑定到该行的fill属性,该属性默认为null。设置线条的fill属性或绑定到类似stroke属性的东西,效果很好。请参阅我上面的评论。该问题绑定到该行的fill属性,该属性默认为null。设置线条的“填充”属性或绑定到类似于“笔划”属性的内容,这样效果会很好。