2012-12-14 3 views
1

JList에 대해 ListSelectionListener을 쓰려고하는데, 사용자가 어떤 목록 항목을 선택할지, 그리고 어떤 목록 항목을 선택할지 알고 있습니다. 목록은 {Apple, Orange, Pear}의 세 가지 항목을 가지며, 현재 선택 Orange에 있고, 사용자는, Pear 선택한 경우 : 그래서Swing ListSelectionEvent의 "source"항목을 가져 오는 방법은 무엇입니까?

  • srcFruitOrange이고; 및
  • destFruit 여기 Pear

이다 내가 가지고있는 코드입니다 :

myList.addListSelectionListener(new ListSelectionListener() { 
    public void valueChanged(ListSelectionEvent fruitSelectionEvent) { 
     printSourceAndDestFruit(myList, fruitSelectionEvent); 
    } 
}); 

private void printSourceAndDestFruit(JList list, ListSelectionEvent event) { 
    FruitVO srcFruit = (FruitVO)list.getModel().getElementAt(event.getFirstIndex()); 
    FruitVO destFruit = (FruitVO)list.getModel().getElementAt(event.getLastIndex()); 

    System.out.println("srcFruit = " + srcFruit.getName() + " and destFruit = " = destFruit.getName()); 
} 

응용 프로그램이로드와 JList를 초기화에는 기본 선택 사항이 없습니다. 나는 다음과 같은 작업을 수행 할 때 :

  1. 을 다시 클릭 Orange
  2. 클릭 Pear
  3. 클릭 Orange

다음은 인쇄 내가 얻을 밖입니다 :

srcFruit = Orange and destFruit = Pear 
srcFruit = Orange and destFruit = Pear 

어디 갈거야 여기서 뭐라구? getFirstIndex()/getLastIndex()이 버그가 있거나 올바른 스윙 메서드를 사용하고 있지 않습니까? , 내가 만든 그래서 비록

srcFruit = Orange and destFruit = Pear 
srcFruit = Pear and destFruit = Orange 

3 선택 (마우스 클릭), 나는 Orange 다음에 하나 개의 값에서 변화하지 않았다 클릭 처음부터 :

는 여기에 내가보고해야 출력입니다 내가 믿지 말고 printSourceAndDestFruit을 호출하는 것이 정확합니다. 내가 Pear을 선택하고 srcFruitOrange이고 destFruitPear이라는 것이 옳다. 그러나 Orange으로 다시 돌아 가면 두 번째 println은 srcFruitPear이고 destFruitOrange으로 표시되어야합니다. 왜 그렇지 않습니까?!?!

미리 감사드립니다.

답변

3

첫 번째 및 마지막 색인은 사용자가 생각하는 것이 아닙니다. 여기에 자바 독의 말씀입니다 :

는 선택이 변경된 가능성이있는 최초의 행의 인덱스를 돌려줍니다()

getFirstIndex.

getLastIndex()는

선택 변경 될 수도 마지막 행의 인덱스를 반환.

그래서, 각 클릭에 배, 오렌지 변화의 선택 이후, 배이기 때문에 목록에 오렌지 후, getFirstIndex() 항상 오렌지를 반환하고 getLastIndex() 항상 배를 반환합니다.

새 선택 항목을 마지막 항목과 비교하려면 일부 멤버 변수에서 마지막 선택 항목을 유지하고 선택 항목이 변경 될 때마다 새 선택 항목과 비교하고 getValueIsAdjusting()이 false를 반환합니다.

1

그 선택이 순서 Orange에있는 이유는, PearDefaultListSelectionModel 전화 fireValueChanged가 전적으로 ListModel보다는 새로운 선택 인덱스에있는 항목의 인덱스 위치를 기반으로한다는 것입니다.

이 관련 bug report

비슷한 질문을하지만 보여줍니다이 정상적인 동작 이었다는 것을 당신이 사용하여 해결 방법을 추가 할 수 있음을 보여 주었다 :

FruitVO srcFruit = (FruitVO)list.getModel().getElementAt(list.getMinSelectionIndex()); 
FruitVO destFruit = (FruitVO)list.getModel().getElementAt(list.getMaxSelectionIndex()); 
관련 문제