GraphStream の View と JTextField 間の同期の問題

WBOY
リリース: 2024-02-22 12:30:17
転載
1031 人が閲覧しました

php editor Strawberry は、この記事で GraphStream の View と JTextField の間の同期の問題に関する Java Q&A を紹介します。 GraphStream ライブラリを使用する場合、View と JTextField の間のデータ同期で問題が発生することがあります。この記事を通じて、この問題を解決し、Java プログラムをよりスムーズかつ効率的にする方法を学びます。

問題の内容

問題を https://github.com/graphstream/gs-ui-swing/issues/19#issue-2109865450 に投稿しました。ただし、このリポジトリの最後の回答は 2021 年 6 月 10 日に投稿され、他の質問は返信なしで投稿されたため、そこにある質問にまだ注目している人がいるかどうかはわかりません。だからこそ、ここで改めて質問させていただきます。

ビューと 2 つの jtextfield で構成される jframe を作成しました:

ビューには 5 つのノードが表示されます。4 つは単なるランドマークであり、ユーザーによって移動される予定はなく (「fixed_*」)、1 つはユーザーによって移動されます (「unfixed」)。 2 つの jtextfield には、「固定されていない」ノードの座標が表示されます。 view と jtextfield の両方が相互に同期している必要があります。実際、ユーザーがビュー内で「固定されていない」ノードを移動すると、両方の jtextfield がそれに応じて更新される必要があります。

逆に、ユーザーがいずれかの jtextfield の座標を変更すると、それに応じてビューも更新される必要があります。

ここに 4 つのテスト ケースがあります:

    テスト ケース 1: ユーザーがアプリケーションを実行し、ビュー内の「固定されていない」ノードを移動します。
  • テスト ケース 2: ユーザーがアプリケーションを実行し、jtextfield の 1 つの座標を変更します。
  • テスト ケース 3: ユーザーはアプリケーションを実行し、jtextfield の 1 つの座標を変更してから、ビュー内の「固定されていない」ノードを移動します。
  • テスト ケース 4: ユーザーはアプリケーションを実行し、ビュー内で「固定されていない」ノードを移動し、jtextfield の 1 つの座標を変更します。
テスト ケース 1、2、および 3 は正常に機能しますが、テスト ケース 4 は機能しません。実際、テスト ケース 4 では、ユーザーがビュー内で「固定されていない」ノードを移動すると、jtextfield の 1 つの座標を変更してもビューは更新されません。

テスト ケース 3 と 4 の実行の違いを分析しようとしています。これを行うために、コード内のさまざまな場所に現在のスレッドの名前を出力しました。 jtextfield を介した変更はスレッド「awt-eventqueue-0」(swing のイベント ディスパッチ スレッドですよね?) で実行され、ビューを介した変更はスレッド「thread-0」で実行されていることがわかります。私の実装では、「thread-0」はグラフストリームのポンプ ループを実行するスレッドで、グラフストリームのビューア スレッドで発生するイベントを待機し、それらを「thread-0」内にコピーして戻します。グラフストリームのドキュメントに関する私の理解では:

    Graphstream のビューアは常に Swing のイベント ディスパッチ スレッド (edt) で実行されます。
  • グラフストリームのビューアに関連付けられたグラフストリームのグラフは、使用されるグラフストリームのスレッドモデルに応じて、edt または別のスレッドからアクセスできます。
  • 別のスレッドからグラフストリームのグラフにアクセスすることは、グラフストリームのビューアと並行してグラフ上でアルゴリズムを実行できるため、edt よりも強力です。
  • ドキュメントを完全に理解しましたか?

私の実装では、swing スレッドの外側の別のスレッドからグラフストリームのグラフにアクセスすることを選択しました。したがって、以前に実行したテスト ケース 3 と 4 から次のように推測します。

edt からグラフストリームのビューを更新しても、「スレッド 0」からのグラフストリームのビューの将来の更新は妨げられません (テスト ケース 3)、

    ただし、「スレッド 0」のグラフストリーム ビューを更新すると、edt のグラフストリーム ビューを今後更新できなくなります (テスト ケース 4)。
  • 私はこれらすべてのスレッドで間違ったことをしているという印象を持っています。手伝ってもらえますか?
私の問題を再現するために、最小限の動作例 (mwe) を作成しようとします。以下は、Java ソース ファイルnodesynctest.java の内容です:

リーリー

これは、すべての依存関係を含む実行可能 jar を構築するために使用される Maven pom ファイル pom.xml です:

リーリー

これら 2 つのファイルを使用するには、フォルダー mwe/ を作成し、nodesynctest.java を mwe/src/main/java/mwe/ に配置し、pom.xml を mwe/ に配置してから、mwe/ run

mvn コンパイル済みアセンブリ: 単一

###そして### java -jar target/mwe-0.0.1-snapshot-jar-with-dependency.jar

これは完全なプロジェクト フォルダーです: mwe.zip

解決策

いくつかのデバッグの後、最終的に問題を発見しました。次の行を変更するだけです:

リーリー

2 行を渡します:

リーリー

すべてが適切に機能するようにします。

###なぜ### リーリー

機能しないというのは私にとって未だに謎です。実際、

//m.sbmmt.com/link/c305a250710e95cf6bad18c18a1c02f4

//m.sbmmt.com/link/7c097a5ed40a8d91afd49026dd3b1062

のドキュメントには、 # を使用できると記載されています。 # #xy

属性を使用してノードの座標を設定します。ただし、属性

xyz

の使用も推奨されます。そこでコードを次のように変更してみました:

并且它有效!我将在项目的 github 存储库上发布问题。

以上がGraphStream の View と JTextField 間の同期の問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!