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

时间:2017-03-10 20:50:40

标签: canvas javafx repaint

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

编辑:我发现如果我在GraphicsContext上调用clearRect,指定整个画布,它将正确重新绘制,但我认为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 Netbeans 8.0.2 Windows 10

1 个答案:

答案 0 :(得分:1)

这里可能存在误解。 JavaFX不会自动重绘画布中的任何内容。我改变它的大小你必须像上次更新一样再次绘制每一个。