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