>Java >GraphStream의 View와 JTextField 간의 동기화 문제

GraphStream의 View와 JTextField 간의 동기화 문제

WBOY
WBOY앞으로
2024-02-22 12:30:171065검색

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일에 게시되었고, 다른 질문들은 답변 없이 게시되었기 때문에, 아직도 거기 질문에 관심을 갖고 계신 분이 계실지 모르겠습니다. 그래서 여기서 다시 질문을 드립니다.

뷰와 두 개의 jtextfield로 구성된 jframe을 만들었습니다.

뷰에는 5개의 노드가 표시됩니다. 4개는 랜드마크일 뿐이며 사용자가 이동할 것으로 예상되지 않으며("fixed_*"), 하나는 사용자가 이동합니다("unfixed"). 두 개의 jtextfield는 "고정 해제된" 노드의 좌표를 표시합니다. view와 jtextfield는 모두 서로 동기화되어야 합니다. 실제로 사용자가 뷰에서 "고정 해제된" 노드를 이동하면 두 jtextfield가 그에 따라 업데이트되어야 합니다.

반대로 사용자가 jtextfield 중 하나의 좌표를 수정하면 그에 따라 뷰도 업데이트되어야 합니다.

다음은 네 가지 테스트 사례입니다.

  • 테스트 사례 1: 사용자가 앱을 실행하고 보기에서 "고정 해제된" 노드를 이동합니다.
  • 테스트 사례 2: 사용자가 애플리케이션을 실행하고 jtextfield 중 하나의 좌표를 수정합니다.
  • 테스트 사례 3: 사용자가 애플리케이션을 실행하고 jtextfield 중 하나의 좌표를 수정한 다음 뷰에서 "고정 해제된" 노드를 이동합니다.
  • 테스트 사례 4: 사용자가 애플리케이션을 실행하고 뷰에서 "고정 해제된" 노드를 이동한 다음 jtextfield 중 하나에서 좌표를 수정합니다.

테스트 사례 1, 2, 3은 제대로 작동하지만 테스트 사례 4는 작동하지 않습니다. 실제로 테스트 사례 4에서는 사용자가 뷰에서 "고정 해제된" 노드를 이동하면 jtextfield 중 하나의 좌표를 수정해도 뷰가 업데이트되지 않습니다.

테스트케이스 3과 4의 실행 차이를 분석하려고 합니다. 이를 위해 코드의 여러 위치에 현재 스레드의 이름을 인쇄했습니다. jtextfield를 통한 수정은 스레드 "awt-eventqueue-0"(스윙의 이벤트 디스패치 스레드, 아니요?)에서 실행되는 반면, 뷰를 통한 수정은 스레드 "thread-0"에서 실행되는 것을 확인했습니다. 내 구현에서 "thread-0"은 그래프스트림의 펌프 루프를 실행하는 스레드이며, 그래프스트림의 뷰어 스레드에서 발생하는 이벤트를 기다리고 이를 "thread-0" 내에서 다시 복사합니다. 그래프스트림 문서에 대한 나의 이해:

  • graphstream의 뷰어는 항상 Swing의 이벤트 발송 스레드(edt)에서 실행됩니다.
  • 그래프스트림의 뷰어와 연결된 그래프스트림의 그래프는 사용된 그래프스트림의 스레딩 모델에 따라 edt 또는 다른 스레드에서 액세스할 수 있습니다.
  • 다른 스레드에서 그래프에 액세스하는 것은 graphstream의 뷰어와 병렬로 그래프에서 알고리즘을 실행할 수 있기 때문에 edt보다 더 강력합니다.

문서를 완전히 이해했나요?

제 구현에서는 스윙 스레드 외부의 다른 스레드에서 graphstream의 그래프에 액세스하기로 선택했습니다. 그래서 저는 이전에 실행한 테스트 사례 3과 4에서 다음과 같이 추론했습니다.

  • edt에서 그래프스트림 보기를 업데이트해도 "thread-0"(테스트 사례 3)에서 그래프스트림 보기의 향후 업데이트가 방해되지 않습니다.
  • 그러나 "thread-0"의 그래프 스트림 보기에 대한 업데이트는 edt의 그래프 스트림 보기에 대한 향후 업데이트를 방지합니다(테스트 사례 4).

나는 이 모든 스레드에 대해 내가 잘못된 일을 하고 있다는 인상을 받고 있습니다. 도와주세요?

저는 문제를 재현하기 위해 최소 작업 예제(mwe)를 만들려고 노력합니다. 다음은 Java 소스 파일 nodesynctest.java의 내용입니다.

으아악

이것은 모든 종속성이 있는 실행 가능한 jar를 빌드하는 데 사용되는 maven pom 파일 pom.xml입니다.

으아악

이 두 파일을 사용하려면 mwe/ 폴더를 만들고 nodesynctest.java를 mwe/src/main/java/mwe/에 넣고 pom.xml을 mwe/에 넣은 다음 mwe/에서 실행하세요.

mvn 编译程序集:single

그리고

java -jar 目标/mwe-0.0.1-snapshot-jar-with-dependency.jar

전체 프로젝트 폴더는 다음과 같습니다: mwe.zip

Solution

몇 가지 디버깅 후에 마침내 문제를 발견했습니다. 줄만 바꾸면 돼요 :

으아악

두 줄로:

으아악

모든 것이 제대로 작동하도록 하세요.

으아악

일을 하지 않는다는 것은 나에게 아직도 미스터리다. 실제로 https://www.php.cn/link/c305a250710e95cf6bad18c18a1c02f4https://www.php.cn/link/7c097a5ed40a8d91afd49026dd3b1062에 대한 문서에서는 xy 属性来设置节点的坐标。但也鼓励使用属性 xyz를 사용할 수 있다고 나와 있습니다. 그래서 코드를 다음과 같이 변경해 보았습니다.

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

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

위 내용은 GraphStream의 View와 JTextField 간의 동기화 문제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제