Не отображаются элементы на панели внутри панели
Пишу векторный холст на JavaFX (векторная графика, просто фигуры на холсте отображаются): ну чтобы можно было по нему перемещаться и приближать.
Так как при translate положение левого верхнего угла node меняется, и он больше не реагирует на нажатия, решил внутри самого холста сделать панель, на которой как раз и будет всё отображаться.
Внутри 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);
}
}
Ответы (1 шт):
Оказывается, нельзя переопределить методы getChildren() и getChildrenUnmodifiable(), чтобы вернуть в них детей другого узла.
Это сбивает с толку JavaFX.