问题描述
好吧,这终于是我对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.1
(javaFX 13.0.1
)的JDK 1.8.231上运行它,结果完全相同。
任何对此的帮助将非常受欢迎。我现在已经死胡同了。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)