我正在用 JavaFX 编写一个矢量画布(矢量图形,只显示画布上的形状):好吧,这样您就可以四处移动并放大它。
由于随着 translate 节点左上角的位置发生变化,它不再响应点击,我决定在画布本身内部制作一个面板,所有内容都将显示在上面。
里面VectorCanvas
是VectorCanvasContent
。
添加了行VectorCanvasContent
,但由于某种原因它们不可见(尽管它们是可见的,但我添加了一个侦听器,在单击它们时显示“!!!”并选中)。
如果您在画布本身上绘制线条,则它们是可见的。
问题是什么?
public class VectorCanvas extends Pane {
public class VectorCanvasContent extends Pane {
// public final ChangeListener<Number> widthChangeListener
// = (observable, oldValue, newValue) -> setWidth(newValue.doubleValue());
// public final ChangeListener<Number> heightChangeListener
// = (observable, oldValue, newValue) -> setHeight(newValue.doubleValue());
public VectorCanvasContent() {
// VectorCanvas.this.widthProperty().addListener(widthChangeListener);
// VectorCanvas.this.heightProperty().addListener(heightChangeListener);
// widthProperty().addListener((observable, oldValue, newValue)
// -> System.out.println("Content: width: " + newValue));
// heightProperty().addListener((observable, oldValue, newValue)
// -> System.out.println("Content: height: " + newValue));
}
}
public static final Consumer<VectorCanvas> DEFAULT_DRAWER = canvas -> {
Line[] lines = {
new Line(0, 0, canvas.getWidth(), 0),
new Line(canvas.getWidth(), 0, canvas.getWidth(), canvas.getHeight()),
new Line(canvas.getWidth(), canvas.getHeight(), 0, canvas.getHeight()),
new Line(0, canvas.getHeight(), 0, 0),
new Line(0, 0, canvas.getWidth(), canvas.getHeight()),
new Line(0, canvas.getHeight(), canvas.getWidth(), 0)
};
for (Line line : lines) {
line.setStrokeWidth(30);
line.setStroke(Color.RED);
line.setFill(Color.RED);
line.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
System.out.println("!!!");
}
});
}
canvas.drawAll(lines);
};
private Consumer<VectorCanvas> drawer = DEFAULT_DRAWER;
public final VectorCanvasContent content = new VectorCanvasContent();
public VectorCanvas() {
this(DEFAULT_DRAWER);
}
public VectorCanvas(Consumer<VectorCanvas> drawer) {
this.drawer = drawer;
getRealChildren().add(content);
draw();
}
public void clear() {
getChildren().clear();
}
public void draw() {
if (drawer != null)
drawer.accept(this);
}
public void redraw() {
clear();
draw();
}
@Override
public ObservableList<Node> getChildren() {
return content.getChildren();
}
@Override
public ObservableList<Node> getChildrenUnmodifiable() {
return content.getChildrenUnmodifiable();
}
private ObservableList<Node> getRealChildren() {
return super.getChildren();
}
private ObservableList<Node> getRealChildrenUnmodifiable() {
return super.getChildrenUnmodifiable();
}
public void draw(Shape shape) {
getChildren().add(shape);
}
public void drawAll(Shape... shapes) {
getChildren().addAll(shapes);
}
}
getChildren()
事实证明,您不能重写and方法getChildrenUnmodifiable()
来返回其中另一个节点的子节点。这让 JavaFX 感到困惑。