我是JavaFX的新手。我想要实现的只是在控制器从另一个线程接收事件后更新JavaFX文本区域上的文本。但它有时会挂起同样的例外。
以下是发生的事情:
Other thread -> Trigger event -> Do proccess at an event handler on JavaFX controller -> Hang with exception.
我总是得到的例外是这样的:
java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(ArrayList.java:371)
at java.util.ArrayList.get(ArrayList.java:384)
at com.sun.javafx.collections.ObservableListWrapper.get(ObservableListWrapper.java:208)
at com.sun.javafx.scene.control.skin.TextAreaSkin$ContentView.layoutChildren(TextAreaSkin.java:291)
at javafx.scene.Parent.layout(Parent.java:1018)
at javafx.scene.Parent.layout(Parent.java:1028)
at javafx.scene.Scene.layoutDirtyRoots(Scene.java:513)
at javafx.scene.Scene.doLayoutPass(Scene.java:484)
at javafx.scene.Scene.access$3900(Scene.java:169)
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2199)
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:363)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:460)
at com.sun.javafx.tk.quantum.QuantumToolkit$9.run(QuantumToolkit.java:329)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:76)
我在事件类上调用事件hendler的代码就像这样:
private void propertyChanged(String propertyName)
{
CortexInspectorEvent event = new CortexInspectorEvent(this);
Iterator i = this.listeners.iterator();
while (i.hasNext())
{
ICortexInspectorEventListener listener = (ICortexInspectorEventListener) i.next();
try
{
listener.onProperpertyChanged(event, propertyName);
}
catch(Exception ex)
{
System.out.println(ex.getMessage());
}
}
}
即使我放置了try-catch,也永远不会捕获异常并且UI仍然挂起。
在我的事件处理程序方法中,即使我放置空方法,UI仍然会挂起。
@Override
public void onProperpertyChanged(CortexInspectorEvent e, String propertyName)
{
CortexInspector inspector = (CortexInspector) e.getSource();
this.logln(inspector.getLog()); // This line of code is just for appending some String to a text area.
}
我不知道怎么问goo * le这样的问题,我尝试了一堆关键字但仍未得到正确答案,所以我在这里问。请帮忙。谢谢。
答案 0 :(得分:1)
您需要对JavaFX应用程序线程上的文本区域执行更新。
通过Platform.runLater来电给您的听众打电话。这将确保在JavaFX应用程序线程上发生侦听器通知。
private void propertyChanged(final String propertyName) {
final CortexInspectorEvent event = new CortexInspectorEvent(this);
final Iterator i = this.listeners.iterator();
while (i.hasNext()) {
final ICortexInspectorEventListener listener = (ICortexInspectorEventListener) i.next();
Platform.runLater(new Runnable() {
@Override public void run() {
listener.onProperpertyChanged(event, propertyName);
}
});
}
}
对于Java8,你可以写:
Platform.runLater(() -> listener.onProperpertyChanged(event, propertyName));
你的try catch逻辑似乎不起作用的原因是因为在JavaFX应用程序线程上引发了异常,而该线程不是执行try catch代码的线程。
您在撰写brain scanner或其他内容; - )