at javafx.graphics/com.sun.javafx.sg.prism.NGCanvas$RenderBuf.validate(NGCanvas.java:214)

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;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Exception in Application constructor Exception in thread "main" java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1071) Caused by: java.lang.RuntimeException: Unable to construct Application instance: class com.example.demo.Main at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:891) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196) at java.base/java.lang.Thread.run(Thread.java:833) Caused by: java.lang.IllegalAccessException: class com.sun.javafx.application.LauncherImpl (in module javafx.graphics) cannot access class com.example.demo.Main (in module com.example.javafxtest) because module com.example.javafxtest does not export com.example.demo to module javafx.graphics at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:392) at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:674) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:489) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:803) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456) at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184) ... 1 more
05-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风铃峰顶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值