java.lang.NullPointerException
at javafx.graphics/com.sun.javafx.sg.prism.NGCanvas$RenderBuf.validate(NGCanvas.java:214)
at javafx.graphics/com.sun.javafx.sg.prism.NGCanvas.initCanvas(NGCanvas.java:644)
at javafx.graphics/com.sun.javafx.sg.prism.NGCanvas.renderContent(NGCanvas.java:607)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.renderForClip(NGNode.java:2313)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.renderClip(NGNode.java:2281)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2066)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:578)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.renderForClip(NGNode.java:2313)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.renderRectClip(NGNode.java:2207)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.renderClip(NGNode.java:2233)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2066)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
at javafx.graphics/com.sun.javafx.sg.prism.NGSubScene.renderContent(NGSubScene.java:218)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:270)
at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:578)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2072)
at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1964)
at javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.doPaint(ViewPainter.java:479)
at javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.paintImpl(ViewPainter.java:328)
at javafx.graphics/com.sun.javafx.tk.quantum.PresentingPainter.run(PresentingPainter.java:91)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
at javafx.graphics/com.sun.javafx.tk.RenderJob.run(RenderJob.java:58)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
at java.base/java.lang.Thread.run(Thread.java:834)
阻止报错,但不能解决对程序的影响:
VM Options:-Dprism.order=sw
暂时调查的方案是减少Canvas的宽、高:new Canvas(width, height);或者分成n个Canvas。但这也不是优解,受操作系统、电脑硬件影响,Canvas可适配的width、height上限也不同,真得坑!
测试类:
package canvas;
import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.geometry.Point2D;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.*;
import javafx.stage.Stage;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* @Author: ZhangHao
* @Description: Canvas测试
* @Date: 2020/3/16 10:44
* @Version: 1.0
*/
public class CanvasTest extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
Canvas canvas = new Canvas(5000, 6000);
GraphicsContext gc = canvas.getGraphicsContext2D();
Map<Double, Path> pathMap = new HashMap<>();
pathMap.put(1D, getPath(Color.RED, new Point2D(10, 40), new Point2D(10, 200),
new Point2D(200, 200), new Point2D(10, 40)));
Iterator<Double> iter = pathMap.keySet().iterator();
while (iter.hasNext()) {
Double value = iter.next();
Path path = pathMap.get(value);
gc.setFill(path.getFill());
gc.save();
gc.beginPath();
ObservableList<PathElement> pathElementList = path.getElements();
for (PathElement pathElement : pathElementList) {
if (pathElement instanceof MoveTo) {
MoveTo moveTo = (MoveTo) pathElement;
gc.moveTo(moveTo.getX(), moveTo.getY());
} else if (pathElement instanceof LineTo) {
LineTo lineTo = (LineTo) pathElement;
gc.lineTo(lineTo.getX(), lineTo.getY());
} else if (pathElement instanceof ClosePath) {
gc.closePath();
}
}
gc.fill();
gc.restore();
}
canvas.setLayoutX(0);
canvas.setLayoutY(0);
Pane pane = new Pane();
pane.getChildren().add(canvas);
primaryStage.setScene(new Scene(pane, 200, 200));
primaryStage.show();
}
private Path getPath(Color color, Point2D... point2DS) {
Path path = new Path();
path.setFill(color);
int i = 0;
for (Point2D point2D : point2DS) {
if (i == 0) {
path.getElements().add(new MoveTo(point2D.getX(), point2D.getY()));
} else {
path.getElements().add(new LineTo(point2D.getX(), point2D.getY()));
}
if (i == point2DS.length - 1) {
path.getElements().add(new ClosePath());
}
i++;
}
return path;
}
}