Hey,

this morning I was doing something with the canvas control and got its size
wrong. It was way taller than I expected and I had an NPE somewhere in
NGCanvas but I didn't really understand what was wrong because nothing was
pointing to my code. I don't know how it behaves on linux, I was running
Windows 10.

A minimal example looks like following:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.image.Image;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class CanvasTest extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        Canvas canvas = new Canvas(128, 10000);
        Image img = new
Image("https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";);
        canvas.getGraphicsContext2D().drawImage(img, 0, 0, 128, 128);

        primaryStage.setScene(new Scene(new BorderPane(canvas)));
        primaryStage.show();
    }
}

The StackTrace of the NPE looks like following:
java.lang.NullPointerException
at com.sun.javafx.sg.prism.NGCanvas$RenderBuf.validate(NGCanvas.java:213)
at com.sun.javafx.sg.prism.NGCanvas.initCanvas(NGCanvas.java:640)
at com.sun.javafx.sg.prism.NGCanvas.renderContent(NGCanvas.java:603)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2053)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1945)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:235)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:576)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2053)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1945)
at com.sun.javafx.tk.quantum.ViewPainter.doPaint(ViewPainter.java:477)
at com.sun.javafx.tk.quantum.ViewPainter.paintImpl(ViewPainter.java:330)
at
com.sun.javafx.tk.quantum.PresentingPainter.run(PresentingPainter.java:91)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at com.sun.javafx.tk.RenderJob.run(RenderJob.java:58)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at
com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
at java.lang.Thread.run(Thread.java:748)

I guess you might have to make the canvas a little larger than that to
reproduce it on your system. I was creating the canvas as graphic of a
listcell and didn't realize that it was so large until I started debugging
(in this example the stage height indicates that something's wrong).
Maybe there should be a check with a more meaningful error message?

Thanks,
Selim

Reply via email to