私のアプリケーションでは、ShopLogController.java
で制御される単純なログウィンドウを設計しました。JavaFXウィンドウが開いている間にXミリ秒ごとに操作を実行します
このウィンドウはShopLog
(ShopLogController
と混同すべきでない)クラスからのログ情報を取り、それを表示します。しかし、ShopLog
自体は、存在するすべてのオブジェクトによって変更される可能性があります。したがって、変更された内容があるかどうかを確認する方法は、ログウィンドウの内容をShopLog
クラス内のテキストログと一致させるためです。私がこれまでに調査し
オプション:
はいつでもログが変更と呼ばれる
ShopLogController
の公共update()
機能を実装します。 これは問題なく動作しますが、IMOはGUI /ロジック/パーシスタンス層の厳密な分離に違反します。これは、ロジック層がGUIの更新を促すためにGUIを明示的に呼び出すためです。 (あなたはこれが層-別離の違反ではないと信じているなら、理由を説明してください)は独自のスレッドで実行され、すべてのXミリ秒以上から
update()
を呼び出すUpdaterオブジェクトのいくつかの種類を実装します。 JavaFXではこれが許可されていません。これは、java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-#
を返します。対応するコントローラ内でスレッドを開始します。これも正常に動作しますish。唯一の問題は、アップデートが決して終了しないループ
while(true)
にあることです。このループを終了するには、実行可能なon-close
メソッドが必要です。私は、アプリケーション全体ではなく、単一のウィンドウに対するこのような解決策を認識していません。どのように私は明示的に外部からそうするように、それを求めることなく、私のログ(および他の)窓(複数可)の更新を行うことができます
(stop()
を参照してください)。まだコントローラをウィンドウを閉じるときに終了させますか?
としては、関連するオブジェクトのコードを要請:
構造は、それがここになるにつれてなどの基本です。 String
がにあり、変更するとupdate()
のShopLogController
が呼び出されます。また、ShopLogからコントローラの関数を明示的に呼び出すことは避けたいと思います。これは、ログウィンドウがまだ開かれていないなど、ShopLogが保証されていないためです。
PS:これは実際にはany
実行可能な解決策を見つけることではなく、優雅なものを見つけることです。
ログがテキスト領域に表示されているようです。テキスト領域の 'textProperty()'にリスナーを追加するだけではどうですか?あるいは、私は本当にその質問を理解していないかもしれません...? –
問題を正しく伝えたかどうかわかりません: Stringを保持するShopLogクラスがあります。ログの文字情報を表します。 shopLogControllerは、GUIウィンドウが処理するものだけを処理します。 文字列の変更が最初に起こりました。コントローラーのTextAreaを – nitowa
で更新したいので、 'String'の代わりに' StringProperty'を使用し、それにリスナーを登録します。問題の内容を説明するコードを投稿することができます。 –