将 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 中的任何内容。如果你改变了它的大小,你必须像上次更新时一样重新绘制所有内容。
当 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 中的任何内容。如果你改变了它的大小,你必须像上次更新时一样重新绘制所有内容。