2013-03-23 32 views
2

JavaFX在将文本设置为文本字段时产生NullPointerexception。 此代码生成此异常:如何解决javafx-8中的NullPointerException

public void invalidate() { 
    model.getLock().lock(); 
    try { 
     memoryDisplayTextField.setText(model.getMemory() != 0 ? "M" : ""); 
     mainDisplayTextField.setText(model.getDisplayText()); 
    } finally { 
     model.getLock().unlock(); 
    } 
} 

堆栈跟踪低于:

java.lang.NullPointerException 
at com.sun.javafx.text.TextLayout.layout(TextLayout.java:1365) 
at com.sun.javafx.text.TextLayout.ensureLayout(TextLayout.java:174) 
at com.sun.javafx.text.TextLayout.getBounds(TextLayout.java:197) 
at javafx.scene.text.Text.getLogicalBounds(Text.java:387) 
at javafx.scene.text.Text.impl_computeGeomBounds(Text.java:1182) 
at javafx.scene.Node.updateGeomBounds(Node.java:3322) 
at javafx.scene.Node.getGeomBounds(Node.java:3275) 
at javafx.scene.Node.getLocalBounds(Node.java:3257) 
at javafx.scene.Node.updateTxBounds(Node.java:3335) 
at javafx.scene.Node.getTransformedBounds(Node.java:3175) 
at javafx.scene.Node.updateBounds(Node.java:504) 
at javafx.scene.Parent.updateBounds(Parent.java:1643) 
at javafx.scene.Parent.updateBounds(Parent.java:1643) 
at javafx.scene.Parent.updateBounds(Parent.java:1643) 
at javafx.scene.Parent.updateBounds(Parent.java:1643) 
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2268) 
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:352) 
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:511) 
at com.sun.javafx.tk.quantum.QuantumToolkit$12.run(QuantumToolkit.java:379) 
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source) 
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
at com.sun.glass.ui.win.WinApplication.access$300(Unknown Source) 
at com.sun.glass.ui.win.WinApplication$3$1.run(Unknown Source) 
at java.lang.Thread.run(Thread.java:722) 

有什么解决方法吗?或者我应该等到发布?

谢谢。

+0

是否在JavaFX应用程序线程上调用了'invalidate'方法? – jewelsea 2013-03-23 20:22:45

回答

5

据我所知,问题是由于用JavaFX Application Thread调用setText方法造成的,所以 用Platform.runLater()来包装它解决了这个问题。

public void invalidate() { 
    Platform.runLater(() -> { 
     model.getLock().lock(); 
     try { 
      memoryDisplayTextField.setText(model.getMemory() != 0 ? "M" : ""); 
      mainDisplayTextField.setText(model.getDisplayText()); 
     } finally { 
      model.getLock().unlock(); 
     } 
    }); 
} 

PS感谢jewelsea寻求帮助。

相关问题