Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何扩展JavaFX线条或其他形状_Java_Javafx_Line - Fatal编程技术网

如何扩展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

我想扩展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());
    }

}

请注意,如果(例如)您要这样做,您提供的实现将不起作用

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。设置线条的“填充”属性或绑定到类似于“笔划”属性的内容,这样效果会很好。