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, 3은 제대로 작동하지만 테스트 사례 4는 작동하지 않습니다. 실제로 테스트 사례 4에서는 사용자가 뷰에서 "고정 해제된" 노드를 이동하면 jtextfield 중 하나의 좌표를 수정해도 뷰가 업데이트되지 않습니다.
테스트케이스 3과 4의 실행 차이를 분석하려고 합니다. 이를 위해 코드의 여러 위치에 현재 스레드의 이름을 인쇄했습니다. jtextfield를 통한 수정은 스레드 "awt-eventqueue-0"(스윙의 이벤트 디스패치 스레드, 아니요?)에서 실행되는 반면, 뷰를 통한 수정은 스레드 "thread-0"에서 실행되는 것을 확인했습니다. 내 구현에서 "thread-0"은 그래프스트림의 펌프 루프를 실행하는 스레드이며, 그래프스트림의 뷰어 스레드에서 발생하는 이벤트를 기다리고 이를 "thread-0" 내에서 다시 복사합니다. 그래프스트림 문서에 대한 나의 이해:
문서를 완전히 이해했나요?
제 구현에서는 스윙 스레드 외부의 다른 스레드에서 graphstream의 그래프에 액세스하기로 선택했습니다. 그래서 저는 이전에 실행한 테스트 사례 3과 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
몇 가지 디버깅 후에 마침내 문제를 발견했습니다. 줄만 바꾸면 돼요 :
으아악두 줄로:
으아악모든 것이 제대로 작동하도록 하세요.
왜
으아악일을 하지 않는다는 것은 나에게 아직도 미스터리다. 실제로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!