0

我正面临 NullPointerException,我无法弄清楚它发生的位置或原因。我在一个项目中使用 JavaFX,它包含一个 .fxml 文件,其中包含很多组件(主要是 SVGPaths、Circle 对象和 Text 对象)。它们被导入到 Controller 类中。每个 SVGPath 都有一个鼠标侦听器(用于单击、进入和退出操作),有时我会收到一个 NullPointerException,这让我抓狂,因为我花了好几个小时试图解决它。这是异常的确切堆栈跟踪。

java.lang.NullPointerException
at com.sun.javafx.sg.prism.NGTextHelper.computeBoundsLogical(Unknown Source)
at com.sun.javafx.sg.prism.NGTextHelper.computeContentBounds(Unknown Source)
at javafx.scene.text.Text.impl_computeGeomBounds(Unknown Source)
at javafx.scene.Node.updateGeomBounds(Unknown Source)
at javafx.scene.Node.getGeomBounds(Unknown Source)
at javafx.scene.Node.getLocalBounds(Unknown Source)
at javafx.scene.Node$MiscProperties$2.computeBounds(Unknown Source)
at javafx.scene.Node$LazyBoundsProperty.get(Unknown Source)
at javafx.scene.Node$LazyBoundsProperty.get(Unknown Source)
at javafx.scene.Node.getBoundsInLocal(Unknown Source)
at com.sun.javafx.scene.control.skin.TextAreaSkin$ContentView.layoutChildren(Unknown Source)
at javafx.scene.Parent.layout(Unknown Source)
at javafx.scene.Parent.layout(Unknown Source)
at javafx.scene.Parent.layout(Unknown Source)
at javafx.scene.Scene.layoutDirtyRoots(Unknown Source)
at javafx.scene.Scene.doLayoutPass(Unknown Source)
at javafx.scene.Scene.access$3900(Unknown Source)
at javafx.scene.Scene$ScenePulseListener.pulse(Unknown Source)
at com.sun.javafx.tk.Toolkit.firePulse(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit$9.run(Unknown Source)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$100(Unknown Source)
at com.sun.glass.ui.win.WinApplication$3$1.run(Unknown Source)
at java.lang.Thread.run(Thread.java:722)

如果有人可以提供帮助并解释发生这种情况的原因,我将不胜感激。

4

1 回答 1

1

可能您已经解决了这个问题,但也许我的解决方案会帮助其他人。

如果您在 Swing 应用程序中使用 JavaFX,则必须小心仅在对应线程中执行 JavaFX 代码,并且仅在 EDT 中运行 Swing 代码。

我在我的应用程序中遇到了类似的问题,这是由于在 EDT 中执行了 JavaFX 代码。因此,为了纠正这个问题,我检查了代码以确保在可能从 EDT 调用的方法上使用 Platform.runLater(...)。

Platform.runLater(new Runnable() {
  @Override
  public void run() {
    // JavaFX manipulation code.
  }
}

这看起来很容易,但有时很难记住。因此,可以肯定的是,查看您的 JavaFX 代码,搜索可以由 Swing 组件和事件调用的公共方法和接口。

于 2016-12-01T20:53:42.607 回答