1

私は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)

そして、イベントクラスでイベントヘンドラーを呼び出すための私のコードは次のようになります。

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に尋ねる方法がわかりません。たくさんのキーワードを試しましたが、まだ適切な答えが得られないので、ここで尋ねます。助けてください。ありがとうございました。

4

1 に答える 1

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ロジックが機能していないように見える理由は、trycatchコードを実行しているスレッドではないJavaFXアプリケーションスレッドで例外が発生しているためです。

あなたは脳スキャナーか何かを書いていますか;-)

于 2012-12-24T05:22:46.607 に答える