我有一个绘图窗口,允许用户打开图像,在上面绘图,然后保存。
我将它放在画布上,我可以创建一个空白画布,在其上绘制,并保存它没有任何问题。但是当我试图打开那个图像并做:
GraphicsContext gc = canvas.getGraphicsContext2D();
File file = new File(path);
Image img = new Image(file.toURI().toString());
gc.drawImage(img,0,0);
它和以前一样。我得到一张空白的画布,那张图片永远不会出现。
我在代码中做错了吗?我知道路径是正确的,因为我可以在程序的其他部分的缩略图中看到该图像。
这是一个完整的示例程序
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class GUITest extends Application{
String path = "10-9-2016-22-28.png";
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
Pane root = new Pane();
Canvas canvas = new Canvas(600,800);
GraphicsContext gc = canvas.getGraphicsContext2D();
Image original = new Image(getClass().getResourceAsStream(path));
gc.drawImage(original, 0, 0);
root.getChildren().add(canvas);
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}
}
现在可以使用canvas.widthProperty().bind(root.widthProperty());
和canvas.heightProperty().bind(root.heightProperty());
。将画布尺寸与其父级的尺寸绑定是否有问题?
答案 0 :(得分:0)
执行第一个布局过程时,Pane
的大小变为非0。在大小为(0, 0)
之前。由于大小为(0, 0)
的画布中没有空间,因此删除了所有内容。稍后当Canvas
增长到根的大小时,您不会重绘图像,因此不会显示任何内容。
因此,每次调整Canvas
大小时,您需要再次绘制画布内容(或至少直到大小变为非零)。
出于同样的原因,您需要在根元素处设置场景的首选大小,而不是设置Canvas
大小。
@Override
public void start(Stage primaryStage) throws Exception {
Pane root = new Pane();
root.setPrefSize(600, 800);
Canvas canvas = new Canvas();
GraphicsContext gc = canvas.getGraphicsContext2D();
Image original = new Image(getClass().getResourceAsStream(path));
root.layoutBoundsProperty().addListener((observable, oldValue, newValue) -> {
canvas.setWidth(newValue.getWidth());
canvas.setHeight(newValue.getHeight());
gc.drawImage(original, 0, 0);
});
root.getChildren().add(canvas);
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}