微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

放大到com.sun.javafx.sg.prism.NGShape.renderContentNGShape.java:237

如何解决放大到com.sun.javafx.sg.prism.NGShape.renderContentNGShape.java:237

好吧,这终于是我对StackOverflow的第一个问题。多年来,我一直将它用作知识的来源,并取得了非常出色的成绩。如果您进行足够长时间的挖掘,您几乎总是可以找到解决问题的方法,因为通常已经有人遇到过类似的问题。

但是有了这个我迷路了,似乎没有人拥有相同的东西。我已经期待了很长时间,但是找不到解决方案。

就这样。

描述问题最简单的方法是查看我要附加的代码并运行它。这是一个简单的应用程序,可以在场景中显示圆圈。圆已变形(X旋转45°,Y旋转45°)。现在,当您尝试放大(我使用简单的逐步放大过程进行此Shift + Click =放大,单击=缩小)时,始终会存在一个阈值,即可以显示多少个放大倍数,直到出现此错误并应用崩溃并显示以下错误

java.lang.NullPointerException
at com.sun.javafx.sg.prism.NGShape.renderContent(NGShape.java:237)
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:577)
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:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
at java.lang.Thread.run(Thread.java:748)

对我来说,此缩放比例是6次点击(放大)。缩放是指更改圆的比例参数。 现在有趣的是,如果您不使用Transforms,则可以无限期放大而不会崩溃。实际上,这适用于任何2D形状,矩形也一样。每当我应用变换时,在缩放时,它有时会崩溃。 现在我的问题是,为什么呢?使用过的VRAM崩溃时大约为11%,所以事实并非如此。我读到有些人也有类似的问题,这是由于最大纹理大小所致,但是如何克服呢? 另外,我如何检测到这是最大缩放,并为无法再放大的用户锁定它。但是对于矢量图形来说,放大的数量实际上受到限制是很愚蠢的。

这是我的Main.java:

 package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("sample.fxml"));
        Parent root = loader.load();

        Controller controller = loader.getController();
        controller.drawCircle();

        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root,1000,800));
        primaryStage.show();

    }


    public static void main(String[] args) {
        launch(args);
    }
}

这是sample.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.GridPane?>


<GridPane fx:id="pane" alignment="center" hgap="10" stylesheets="@test.css" vgap="10" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/11.0.1" fx:controller="sample.Controller">
</GridPane>

和Controller.java

package sample;

import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.fxml.FXML;
import javafx.scene.layout.GridPane;
import javafx.scene.shape.Circle;
import javafx.scene.transform.Rotate;

public class Controller {
    @FXML
    GridPane pane;
    Circle circle = new Circle();
    Rotate rotateX = new Rotate(-45,Rotate.X_AXIS);
    Rotate rotateY = new Rotate(-15,Rotate.Y_AXIS);

    DoubleProperty scale = new SimpleDoubleProperty(1);

    public void initialize() {
        pane.setonMouseClicked(mouseEvent -> {
            if (mouseEvent.isShiftDown()) {
                scale.set(scale.getValue()*2);
            } else {
                scale.set(scale.getValue()/2);
            }
        });
    }

    public void drawCircle() {
        circle.setCenterX(100);
        circle.setCenterY(100);
        circle.seTradius(100);
        circle.scaleXproperty().bind(scale);
        circle.scaleYproperty().bind(scale);
        circle.getStyleClass().add("my-circle");
        circle.setCache(false);
        pane.getChildren().add(circle);
        circle.getTransforms().addAll(rotateX,rotateY);
    }
}

最终test.css

.my-circle {
   -fx-stroke: yellow;
   -fx-fill: rgba(255,145,0.1);
}

我尝试在Amazon Correto 11.0.6和JDK 13.0.1javaFX 13.0.1)的JDK 1.8.231上运行它,结果完全相同。 任何对此的帮助将非常受欢迎。我现在已经死胡同了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。