2012-12-24 67 views
1

我是JavaFX的新手。我想實現的只是在控制器從另一個線程接收到事件後更新JavaFX文本區域上的文本。但它有時會掛起同樣的例外。從其他線程進程接收事件後,JavaFX UI凍結

這裏是發生了什麼:

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) 

而且我對事件類調用事件亨德勒代碼僅僅是這樣的:

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. 
} 

我不知道該怎麼問咕*樂像這樣的問題,我已經嘗試了一堆關鍵字,但仍不能獲得正確的答案,所以我在這裏問。請幫忙。謝謝。

回答

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)); 

爲什麼你嘗試捕捉邏輯似乎並沒有工作,因爲除了被未緒的JavaFX應用程序線程所提出的理由它正在執行try catch代碼。

你寫一個brain scanner什麼;-)

+1

大聲笑。我真的想在未來有時做到這一點。爲了掃描像你一樣的人的大腦,並將掃描結果實施到我的大腦,所以我可以像你一樣成爲一個怪胎。哈哈。 – yunhasnawa

+0

無論如何,你的解決方案就像一個魅力。非常感謝你! – yunhasnawa