gpt4 book ai didi

java - 元素不显示在 Pane 内的 Pane 上

转载 作者:行者123 更新时间:2023-12-02 18:07:43 28 4
gpt4 key购买 nike

我正在 JavaFX 中编写 vector Canvas ( vector 图形, Canvas 上仅显示形状):好吧,这样您就可以四处移动并放大它。

由于翻译时节点左上角的位置发生变化,并且不再响应点击,因此我决定在 Canvas 本身内部制作一个面板,所有内容都将显示在上面。

VectorCanvas内部有一个VectorCanvasContent
线条已添加到 VectorCanvasContent 中,但由于某种原因它们不可见(尽管它们在那里,但我添加了一个监听器,当您单击它们时会输出“!!!”并进行检查)。
如果我在 Canvas 本身上画线,那么它们是可见的。

问题是什么?

import javafx.collections.ObservableList;
import javafx.scene.Node;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.*;

import java.util.function.Consumer;

public class VectorCanvas extends Pane {

public class VectorCanvasContent extends Pane {
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(mouseEvent -> System.out.println("!!!"));
}
canvas.drawAll(lines);
};
}

private final Consumer<VectorCanvas> drawer;

public final VectorCanvasContent content = new VectorCanvasContent();

public VectorCanvas() {
this(VectorCanvasContent.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()getChildrenUnmodifying() 以返回不同节点(尤其是包含的节点)的子节点。

这可能会混淆并破坏 JavaFX 布局系统,因为这对它来说是非常意想不到的。

关于java - 元素不显示在 Pane 内的 Pane 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72916613/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com