1

このコード行からランダムな時間に奇妙なエラーが発生しています。

playHead.setValue(atTime)(playHead はSimpleObjectProperty)

playHead要素 (a ) がその値を依存するBindinga の一部として使用されます。これは、いつでも更新され、メインスレッド上にある必要があるということですか?GUITableViewplayHead

のように、次のようにする必要があります。

javafx.application.Platform.runLater(new Runnable() {
    @Override
    public void run() {
        playHead.setValue(atTime);                  
    }
});

playHeadを含むクラスは GUI とは独立して機能できるはずなので、これは奇妙に思えます。メインスレッドで実行されるようにバインディングを定義する方法はありますか? そうすれば、優れたデザイン プラクティスを維持できます。

TableViewバインディングを返すのコールバックは次のとおりです。

public class CuePreWaitCallback implements Callback<TableColumn.CellDataFeatures<Cue,String>, ObservableValue<String>> {

    @Override
    public ObservableValue<String> call(final CellDataFeatures<Cue, String> param) {
        final Timeline preWait = param.getValue().getCueTimeline().getPreWait();
        return new StringBinding() {
            {
                super.bind(param.getValue().getCueTimeline().getPreWait().playhead());
                super.bind(param.getValue().getCueTimeline().getPreWait().waitTime());
            }

            @Override
            protected String computeValue() {
                try {
                    System.out.println("Value Called---------------------------------------------->");
                    return preWait.getAbsoluteDuration().subtract(preWait.getPlayhead()).toString();
                } catch (Exception e) {
                    e.printStackTrace();
                    System.exit(0);
                    return "";
                }

            }
        };
    }

}
4

1 に答える 1

0

はい、GUI (シーングラフなど) に触れるものはすべてアプリケーション スレッドで実行する必要があるため、バックグラウンド スレッドから更新している場合、runLater の使用に関する仮定は正しいです。

ドメイン ロジックを UI ロジックから独立させるためにできることは、UI 関連のコードに、UI の何にもバインドされない一種の「プロキシ」プロパティを持たせることです。バックグラウンド スレッドからバインドしても安全です。次に、プロキシにリスナーを設定し、そのリスナー内で runLater を使用して実際の UI プロパティを更新します。

したがって、タイトルの質問に対する一般的な答えは「いいえ」です。そのプロパティが何らかの形でシーングラフに接続されている場合にのみ「はい」となります。

于 2013-10-14T10:46:26.763 に答える