상황은 다음과 같습니다. 탭이있는 jFrame이 있고 탭 내에 몇 개의 jTables와 jTree가 있습니다. 사용자가 ctrl/shift + 클릭과 일반 클릭 중 어느 것을 사용하는지에 따라 테이블과 트리 사이에서 선택 항목을 연결할 수 있기를 원합니다. Ctrl 키를 누른 상태에서 첫 번째 표/트리를 클릭하면 전체 선택 항목에 추가됩니다. 일반 클릭을 사용하면 다른 표/트리의 선택 항목이 지워집니다. 현재 Java의 jTree 구성 요소에 문제가 있습니다. TreeSelectionListener와 두 인터페이스를 구현하는 클래스가있는 MouseListener를 추가했습니다. MyBigListener를 호출합니다. 즉Java JTree valueChanged before MouseEvent
MyBigListener listener = new MyBigListener();
jTree1.addMouseListener(listener);
jTree1.addTreeSelectionListener(listener);
MyBigListener implements TreeSelectionListener, MouseListener {
private boolean chained = false;
public synchronized setChained(boolean ch){
chained = ch;
}
public synchronized boolean isChained(){
return chained
}
public void valueChanged(TreeSelectionEvent e){
if(isChained()){ blah... }
}
public void mousePressed(MouseEvent e){
setChained(e.isControlDown() || e.isShiftDown());
}
}
내 계획은 사용자가 Ctrl 키를/이동을 사용하는 경우 부울 플래그를 설정 + I 트리 선택 리스너에 의해 구현의 valueChanged (TreeSelectionEvent 전자) 동안 확인 할 수 있음을 클릭했다. valueChanged TreeSelectionEvents 이전에 마우스 이벤트를 처리 할 수 있기를 원하지만, 문제는 valueChanged treeSelection 이벤트 다음에 마우스 이벤트를 수신한다는 것입니다. 마우스로 눌렀을 때 실제로 선택 변경이 시작될 때 마우스 누르기 이벤트가 시작되기 전에 선택 변경 사항을 수신한다는 것은 이상한 일입니다. (벌써 부울 플래그 설정을 동기화했는데, 아이러니하게도 이벤트의 오더 순서를 강조하는 데 도움이되었습니다.)
나는 이미 keyListener를 추가하는 것과 같은 대안을 시도했지만 포커스가 켜져 있으면 작동하지 않습니다. 사용자가 Ctrl 키를 누른 상태에서 jTree를 클릭하면 포커스를 수신하고 valueChanged 선택 이벤트를 발생시키는 별도의 프레임입니다.
감사합니다. 감사합니다.
--EDIT--는 @akf I는 노드 그래프에서 데이터 요약/조작부로서 기능 탭 구획 별도 jTables 및 jTrees있다. 필자는 별도의 jFrame에 표시된 그래프에 조율 된 선택을하기 위해 탭 패널에서 이러한 구성 요소를 사용하고 있습니다. 개별적으로 각 테이블은 jTree처럼 선택을 위해 잘 작동합니다. 그것은 까다로운 창 사이를 조정하고 있습니다. Shift/Ctrl 버튼이 눌려 졌는지 알 수있는 MouseEvent의 결과로 새 선택 항목을 실행하고 새 선택 항목을 공식화 한 다음 상위 항목으로 전달하여 선택 항목을 모두 조정하는 jTable 구성 요소를 사용하면 jTable 구성 요소와 잘 작동합니다. 마지막 선택 영역을 그래프로 보냅니다. 그러나 부모는 창 사이에서 선택을 연결해야하는지 또는 다른 창을 스쿼시해야 하는지를 알아야합니다. jTables을 사용하면 마우스 클릭의 결과로 선택 사항이 변경되므로 다시 괜찮습니다. jTree는 몇 가지 강제 선택을하기 때문에 더 많은 문제가 있습니다. 가지를 클릭하면 모든 나뭇잎이 선택 영역으로 강제 이동됩니다. 그렇게하기 위해 TreeSelectionListener를 구현해야했지만 변경 사항을 실현하기 위해 valueChanged (TreeSelectionEvent) 만 가져 왔습니다. Ctrl + 클릭 및 Shift + 클릭을 수신 대기하는 mouseListener를 추가했지만 이벤트가 항상 같은 순서로 발생하지는 않습니다. 적어도 지금까지는 mousePressed 이벤트 이전에 valueChanged 이벤트를 수신 했으므로 Ctrl 키를 누른 경우 + 선택이 이미 수정 된 후에 발생한 게시물을 클릭하십시오.
지금 당장, 보류중인 선택 변경 사항을 게시하고 MouseListener를 가져 와서 체인으로 보냈지 만 이러한 순서가 같은 순서로 발생한다고 보장되지 않으면 어떤 시점에서 실패. 지연 기 구현은 또한 나에게 잘못된 방식으로 문지른다.
지금까지 도움을 주셔서 감사합니다.
--EDIT2-- @ykaganovich
은 내가 fireValueChanged 메서드를 재정하는 것들에 대해 갈 수있는 올바른 방법에 가까운 생각합니다.내 구성 요소에 따라 다른 구성 요소에 "체인으로 연결된"선택을 야기하는 것에 대한 정의에 따라 valuedChanged 메서드가 실행되기 전에 진행되는 작업에 대한 컨텍스트를 수집해야합니다. 이것은 기본적으로 누가 그것을 트리거하는지에 의해 정의 할 수있는 모든 경우에 직접 호출하는 것을 의미합니다. 나는. 마우스 이벤트가 발생하면 Ctrl 키를 누른 다음 설정 (해석)하고 화재가 발생하도록 설정합니다. 키보드 이벤트로 인해 변경 될 경우, 다시 설정해야하는 항목을 설정 한 다음 실행하십시오. TreeSelectionModel은 갈 길이 멀지 않다고 생각합니다. 이벤트가 발생했을 때의 상황을 여전히 알 수 없기 때문입니다. 이것은 jTree의 일부를 다시 작성해야 할 필요가 있음을 의미한다고 생각하지만, 어떻게 진행되는지 살펴볼 것입니다. 감사.
트리를 마치 테이블의 첫 번째 열을 선택하고 트리 및 테이블 구성 요소를 가로 지르는 선택을 마치 하나처럼 적용하려고합니까? – akf