2012-11-03 31 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; 
    }