2010-04-24 2 views
3

두 개의 JList (카테고리 및 항목)를 코딩하고 싶습니다. 한 카테고리를 클릭하면 해당 카테고리의 모든 항목을 선택해야하며 한 항목을 클릭하면 해당 카테고리를 선택해야합니다. 그래서 JListListSelectionListener을 서로 듣고 선택을 변경합니다.자바 스윙 청취자 : 서로 듣는 구성 요소

어떤 종류의 "루프"에 대해 두려워해야합니까? 이벤트가 소비되었음을 알리는 방법이 있습니까? 사람들이 그런 상황을 어떻게 관리합니까?

감사

Beans Binding API에서

답변

1

마다 메이크 선택 listA에, 당신은 누구의 작업은 선택 listB에 해당하는 모든 항목을 찾을 수 있습니다하는 ListSelectionEventlistA에 대한 리스너에 발사 될 트리거합니다. 그러면 선택을 강제로 listB에서 실행하면 listB 청취자가 처리 할 이벤트가 트리거됩니다. 이것은 listA에 대한 선택을 강제합니다. 단순히 두 명의 청취자를 사용하면 문제가 해결되지 않습니다. - 하나의 리스너를 사용

1 :

나는 두 가지 옵션을 참조하십시오. 이 청취자는 ListSelectionEvent에서 getSource 메소드를 사용하여 이벤트 소스를 테스트해야합니다. 출처가 listB 인 경우 수신기 목록에서 listA을 제거하고 listA을 선택한 다음 다시 읽습니다.

list1.removeListSelectionListener(this); 
list1.setSelectedIndex(e.getFirstIndex()); //this would have to be played with to allow for intervals 
list1.addListSelectionListener(this);` 

2 - 루프를 피하기 위해 두 개의 리스너를 사용하지만 항목을 선택하려고 시도하기 전에 항목이 이미 선택되어 있는지 테스트해야합니다. 이미 선택되어 있다면 다시 선택하지 마십시오.

0

봐. 여기에 NetBeans 용 tutorial이 있습니다.

0

두 명의 청취자가 그 일을하는 것이 좋습니다. 걱정하지 마세요. 루프가 아닌 한 번만 리스너를 만들도록하십시오. 당신이 상상하는 것처럼

-1

포커스가있는 곳을 확인하십시오. 청취자가 구성 요소 A를 청취하고 초점이 A가 아닌 경우 A가 사용자가 변경 한 구성 요소가 아니므로 다른 구성 요소를 업데이트하지 마십시오.

+0

초점이 맞지 않습니다 (f.i. 선택은 프로그래밍 방식으로 발생할 수 있습니다 ...) – kleopatra

+0

그의 경우는 아닙니다. 나는 초점에 의존하는 것이 불필요한 오버 헤드없이 이것을 구현하는 좋은 방법이라고 생각한다. 그는 "comp X에서 뭔가를하십시오"=> "update Y"에 대해 이야기하고있었습니다. 그는 프로그래밍 방식으로 이러한 구성 요소를 변경한다고 언급하지 않았습니다. – Timmos

+0

어깨를 움츠림 - 자유롭게 오류를 고집 할 수 있습니다. 결국 근시안적인 코딩의 결과를 겪을 때 고통을 느끼게 될 것입니다 .-) – kleopatra