Canvas 将画布大小绑定到父级时JavaFX未重新绘制

Canvas 将画布大小绑定到父级时JavaFX未重新绘制,canvas,javafx,repaint,Canvas,Javafx,Repaint,当窗口调整大小但现有图形未失效/重新绘制时,下面的代码将触发doDrawing()(请参见图像链接)。我的理解是JavaFX在幕后处理这个问题。我错过了什么?谢谢 编辑:我发现,如果我在GraphicsContext上调用clearRect,指定整个画布,它将正确地重新绘制,但我认为JavaFX确定了需要重新绘制的内容 导入javafx.application.application; 导入javafx.beans.value.observeValue; 导入javafx.scene.scen

当窗口调整大小但现有图形未失效/重新绘制时,下面的代码将触发doDrawing()(请参见图像链接)。我的理解是JavaFX在幕后处理这个问题。我错过了什么?谢谢

编辑:我发现,如果我在GraphicsContext上调用clearRect,指定整个画布,它将正确地重新绘制,但我认为JavaFX确定了需要重新绘制的内容

导入javafx.application.application;
导入javafx.beans.value.observeValue;
导入javafx.scene.scene;
导入javafx.scene.canvas.canvas;
导入javafx.scene.canvas.GraphicsContext;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.paint.Color;
导入javafx.stage.stage;
公共类Class1扩展了应用程序{
帆布;
公共类1(){}
@凌驾
public void start(Stage)引发异常{
BorderPane border=新的BorderPane();
画布=新画布(300300);
border.setCenter(画布);
场景=新场景(边框);
舞台场景;
stage.show();
canvas.widthProperty().bind(border.widthProperty());
canvas.heightProperty().bind(border.heightProperty());

scene.heightProperty().addListener((Observalevalue您这边可能有误解。JavaFX不会自动在画布上重新绘制任何内容。我想,如果您更改其大小,您必须像上次更新时那样重新绘制每一次。

我想我混淆了JavaFX自动处理双缓冲的事实,以及手动使部分无效的需要对于需要重新绘制的屏幕。不知何故,我认为JavaFX正在查看新的图形,将其与旧图形进行比较,并只更新已更改的内容。除了GraphicsContext.clearRect()之外,还有其他方法可以用于此操作吗?这就是我找到的全部内容。不,对于画布,仅此而已。
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);
    }
}