2016-06-23 6 views
0

내 작업은 alt 키를 누르면 jlist를 클릭 할 때 선택된 요소를 제거 할 수 있습니다. 내 JList의에 마우스 수신기를 추가하여 이런 짓을 :JList 키 입력시 선택한 항목 제거 및 클릭

list.addMouseListener(new MouseAdapter(){ 
     public void mouseClicked(MouseEvent e) { 
      java.util.List selectedItems = list.getSelectedValuesList(); 
      if (e.isAltDown()){ 
       for (Object o : selectedItems){ 
        cm.removeElement(o); //cm is my custom model 
       } 
      } 
     } 
    }); 

내 문제가 선택됩니다가 선택한 두 가지 요소가 있습니다 때 나는 단지 가까운 요소를 누르면 고도와 목록을 클릭한다는 것입니다 후 제거됩니다. 이 입력 조합으로 여러 요소를 제거하는 방법에 대한 단서가 없습니다.

+0

이것은 도움이 될 수 있습니다 : http://stackoverflow.com/questions/7672260/how-to-remove-multiple-items-in-jlist –

+0

이 솔루션은 버튼에서 삭제가 일어나야 할 때 (내 코드와 함께) 작동합니다 딸깍 하는 소리. 마우스 클릭 + 버튼 누름시 발생하면 실패합니다. – cAMPy

답변

3

마우스를 클릭하면 모든 이전 선택이 지워지고 방금 클릭 한 행이 선택됩니다. 따라서 해당 행만 삭제됩니다.

대신 "마우스 오른쪽 클릭"을 처리 한 다음 마우스 오른쪽 버튼을 사용하여 항목을 삭제해야합니다. 당신이 정말로 왼쪽 마우스 클릭에이 작업을 수행하려면

if (e.isAltDown() && SwingUtilities.isRightMouseButton(e)) { 

은 또는 당신은 아마 ListSelectionListener을 사용해야합니다. 선택 항목이 변경 될 때마다 getSelectedValuesList() 메서드를 사용하고 메서드에서 반환 된 List을 저장해야합니다. 그런 다음 MouseListener에서 현재 선택된 항목 목록을 가져 오는 대신 저장된 목록에 액세스합니다.

로직이 두 개의 별도 리스너에 포함되어 있기 때문에이 방법이 마음에 들지 않습니다. 선택 리스너와 마우스 리스너 모두를 구현하는 클래스를 만들 수 있다고 생각합니다.

1

이것은 완벽한 대답이 아닙니다. 그러나 문제을 해결합니다.

선택 이벤트가 어떻게 작동하는지 보려고했습니다. 선택이 발생하면 Mouse pressed 이벤트가 트리거되고 Selection이 발생합니다. 그 때문에, 컴퍼넌트에 이미 추가되고있는 MouseListener가 선택을 실시합니다. 이미 존재하는 MouseListener를 삭제하면 (자), 마우스를 사용한 선택이 행해지 지 않게됩니다. 그래서 나는 이것을했다.

 MouseListener[] adapters = list.getMouseListeners(); 
     for (int i = 0; i < adapters.length; i++) { 
      list.removeMouseListener(adapters[i]); 
     } 

이제 사용자는 마우스를 사용하여 선택을 수행 할 수 없지만 키보드를 사용하여 선택하게됩니다. 그래서 아래가 작동합니다.

 list.addMouseListener(new MouseAdapter() { 

      @Override 
      public void mousePressed(MouseEvent e) { 
      java.util.List selectedItems = list.getSelectedValuesList(); 
      if (e.isAltDown()){ 
       for (Object o : selectedItems){ 
        model.removeElement(o); //cm is my custom model 
       } 
      } 
      } 
     }); 

나는 camickr에 의해 주어진 답이 따라야한다고 생각합니다.