将 canvas 大小绑定到父级时,JavaFX 不重绘

JavaFX not repainting when binding canvas size to parent

当 window 调整大小但现有图形不是 invalidated/repainted 时,下面的代码会触发 doDrawing()(参见 link 图像)。我的理解是 JavaFX 在后台处理这个问题。我错过了什么?谢谢

编辑:我发现如果我在 GraphicsContext 上调用 clearRect,指定整个 canvas,它会正确重绘,但我认为 JavaFX 会识别需要重绘的内容。

Image of canvas not repainting correctly

import javafx.application.Application;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class Class1 extends Application {
    Canvas canvas;

    public Class1() { }

    @Override
    public void start(Stage stage) throws Exception {

        BorderPane border = new BorderPane();
        canvas = new Canvas(300,300);
        border.setCenter(canvas);

        Scene scene = new Scene(border);
        stage.setScene(scene);
        stage.show();

        canvas.widthProperty().bind(border.widthProperty());
        canvas.heightProperty().bind(border.heightProperty());

        scene.heightProperty().addListener((ObservableValue<? extends Number>
                    observableValue, Number number, Number number2) -> {
            doDrawing();
        });

        scene.widthProperty().addListener((ObservableValue<? extends Number>
                    observableValue, Number number, Number number2) -> {
            doDrawing();
        });

        doDrawing();
    }

    public void doDrawing()
    {
        GraphicsContext gc = canvas.getGraphicsContext2D();
        gc.setStroke(Color.BLACK);
        gc.strokeRect(10, 10, canvas.getWidth() - 10, canvas.getHeight() - 10);
    }
}

JDK1.8.0_121 网豆 8.0.2 Windows10

这里你这边可能有误会。 JavaFX 不会自动重新绘制 canvas 中的任何内容。如果你改变了它的大小,你必须像上次更新时一样重新绘制所有内容。