ホームページ  >  記事  >  GraphStream の View と JTextField 間の同期の問題

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

WBOY
WBOY転載
2024-02-22 12:30:171059ブラウズ

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 行を渡します:

リーリー

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

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

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

https://www.php.cn/link/c305a250710e95cf6bad18c18a1c02f4

https://www.php.cn/link/7c097a5ed40a8d91afd49026dd3b1062

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

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

xyz

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

unfixedGraphStreamNode.setAttribute("xyz", myUnfixedNode.x, myUnfixedNode.y, 0.0);

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

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

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。