2012-11-03 33 views

回答

0

因此,爲了爲這兩種情況(JList和JTable)制定解決方案,我製作了一個自定義偵聽器,該偵聽器將應用於有問題的列表和表格。

的listener:

public class DeselectOnClickListener extends MouseAdapter 
{ 
    @Override 
    public void mouseClicked(MouseEvent e) { 
     super.mouseClicked(e); 
     clearselection(e);  
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     super.mousePressed(e); 
     clearselection(e); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     super.mouseReleased(e); 
     clearselection(e); 
    } 

    public void clearselection (MouseEvent e){  
     if (e.getComponent() instanceof JTable){ 
      Point pClicked = e.getPoint(); 
      JTable table = (JTable) e.getSource(); 
      int index = table.rowAtPoint(pClicked); 
      if (index == -1){ 
       table.clearSelection(); 
      } 

     } else if (e.getComponent() instanceof JList){ 
      Point pClicked = e.getPoint(); 
      JList<?> list = (JList<?>) e.getSource(); 
      int index = list.locationToIndex(pClicked); 
      Rectangle rec = list.getCellBounds(index, index); 
      if (rec==null || !rec.contains(pClicked)){ 
       list.clearSelection(); 
      } 
     } 
    } 
} 

注意,這個效果很好SINGLE_SELECCTION,但如果我們想用MULTIPLE_INTERVAL_SELECTIONSINGLE_INTERVAL_SELECTION我建議不要覆蓋mouseReleased(MouseEvent e),因爲這將是明確的選擇,如果釋放鼠標按鍵在選擇範圍之外。

PD:對於這最後一點,我做了如下修正:

@Override 
    public void mouseReleased(MouseEvent e) { 
     super.mouseReleased(e); 
     if (! isIntervalSelectionMode(e)){ 
      clearselection(e); 
     } 
    } 

    public boolean isIntervalSelectionMode (MouseEvent e){ 
     boolean isIntervalSelection = false; 
     if (e.getComponent() instanceof JTable){ 
      isIntervalSelection = ((JTable)e.getSource()).getSelectionModel().getSelectionMode() 
         != ListSelectionModel.SINGLE_SELECTION; 
     }else if (e.getComponent() instanceof JList){ 
      isIntervalSelection = ((JList<?>)e.getSource()).getSelectionModel().getSelectionMode() 
        != ListSelectionModel.SINGLE_SELECTION; 
     } 
     return isIntervalSelection; 
    }