2017-09-10 9 views
0

私はチャットがMYSQLに保存されているアプリケーションを作成しており、アプリケーションで定期的に取得しています。JavaFX:ユーザーの予告なしにVBoxを更新する方法

データベースからチャットを取得して、メッセージを繰り返し処理し、1つずつVBoxに挿入します。 これを入れる前に、重複したメッセージが表示されないように、VBoxをクリアしておきます。 私はexecutorを使って別のスレッドを使い、それを2秒ごとに実行するようにスケジュールしました。

VBoxをクリアしてメッセージを入力すると、VBoxが最初にクリアされてからメッセージが挿入され、2秒ごとに続行されるため、問題が発生します。

この効果が目立たないように解決策はありますか?

javafxと同じスレッドで試してみましたが、メッセージがクリアされてから挿入されるまでの遅延は目立ちませんでしたが、少数のメッセージに対してのみ有効でした。したがって、多数のメッセージがあるため、それらの反復によりGUIがフリーズします。

+2

コードの平和を投稿してください。 –

+0

ありがとうが、私はそれを自分で解決した。 – zubair130

答えて

0

ノードの数が要素の数とともに増加しないGUI要素を使用します。

など。 ListView/TableViewを使用することも、表示されている子のみを表示する同様のコントロールを作成することもできます。 (行動はthe javadocs for Cellに記載されています)。

ListView<Message> messageList(ここMessage単一のメッセージのデータを含むクラス、適切なMessage.toString実装または必要cellFactory)非アプリケーションスレッドからこのようにリフレッシュすることができる:

final Message[] messages = retrieveMessages(); 
Platform.runLater(() -> messageList.getItems().setAll(messages)); 

あなたまた、例えば転送される必要のあるデータの量を減らすことができる。作成された時刻を示すメッセージを含むテーブルの行にタイムスタンプを追加し、最後にデータを取得してから変更されたメッセージのみを取り出すことによって、データセット全体を置き換える必要がなくなり、新しいメッセージのみ、例えば

final Message[] messages = retrieveNewMessages(); 
Platform.runLater(() -> messageList.getItems().addAll(messages)); 
+1

@ smac89もちろん、これには同期のためのいくつかの考慮事項が必要ですが、メッセージを取得する固定遅延の 'ScheduledExecutorService'は、メッセージが正しい順序で追加されることを確認します... – fabian

+0

あなたの提案をありがとう。回答の一番下に書いた同様の戦略(例:タイムスタンプ)で既に解決しました。とにかくお時間をありがとう。 – zubair130