2013-04-20 32 views
2

一個非常類似的問題已被要求here,雖然我承認它,但問題的解決方案並不完全解決我的問題。點擊時,A JList將選擇最接近鼠標點擊的索引列表項。 A JList也會爲每次點擊+拖動事件觸發做到這一點。如何防止JList在拖動列表末尾時選擇元素?

我想阻止我的JList在點擊+拖動事件點擊+拖動位置不在可見列表中時選擇項目。我將如何去做這件事?

我曾考慮重寫一個不同的方法,一個涉及點擊+拖動選擇列表項的事件。我想試試setSelectionInterval()的方法。

JList<String list = new JList<String>(){ 
     private static final long serialVersionUID = 1L; 
     @Override 
     public int locationToIndex(Point location) { 
      int index = super.locationToIndex(location); 
      if (index != -1 && !getCellBounds(index, index).contains(location)) { 
       clearSelection(); 
       return -1; 
       //an excellent click-only solution to prohibit the selecting of 
       //items from beyond the visible list 
      } 
      else { 
       return index; 
      } 
     } 
     @Override 
     public void setSelectionInterval(int anchor, int lead) { 
      super.setSelectionInterval(anchor, lead); 
      System.out.println("setSelectionInterval"); 
     }   
    }; 

我發現,每次我點擊提供的任何拖累顯示JList,我得到我加入到上述方法「setSelectionInterval」的System.out的消息。在壓倒一切的方法方面,我不知道該從哪裏走。也許這不是我應該如何處理這個問題。在setSelectionInterval()的源代碼中,我迷路了,試圖找到通向任何聽衆的方式,所以我來到了這裏。 :p

我非常感謝任何指向我應該看的地方或一個解決方案。提前致謝!

這是一個接近我設置的SSCCE示例。實際上,當點擊事件從列表項自身被觸發時,列表不會選擇一個項目。當點擊+拖動事件從列表項中被觸發時,我希望發生同樣的效果。

import java.awt.BorderLayout; 
import java.awt.Point; 

import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JPanel; 



public class TestMain { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     JPanel content = new JPanel(new BorderLayout()); 

     String[] data = {"Luke", "Jeff", "Bryce"}; 
     JList<String> list = new JList<String>(data){ 
      private static final long serialVersionUID = 1L; 

      @Override 
      public int locationToIndex(Point location) { 
       System.out.println("location to index"); 
       int index = super.locationToIndex(location); 
       if (index != -1 && !getCellBounds(index, index).contains(location)) { 
        clearSelection(); 
        return -1; 
       } 
       else { 
        return index; 
       } 
      } 
     } 

     content.add(list, BorderLayout.CENTER); 
     frame.setContentPane(content); 
     frame.setSize(200,200); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

} 
+0

爲了更好地幫助越早,張貼[SSCCE(http://sscce.org/)。 – 2013-04-20 04:20:44

+0

我不知道我會怎麼做,對不起。我無法得到我想要工作的東西。 – 2013-04-20 04:24:29

+0

*「我無法得到我想要工作的東西」* SSCCE不必「工作」,但必須符合縮寫的條款。閱讀文章,如果有什麼你不明白的,問。我很好解釋。 – 2013-04-20 04:26:55

回答

3

如果禁用整個拖動的特點是可以接受的,那麼下面的應該有所幫助:

@Override 
protected void processMouseMotionEvent(MouseEvent e) { 
    if(MouseEvent.MOUSE_DRAGGED != e.getID()) { 
     super.processMouseMotionEvent(e); 
    } 
} 
2

我想阻止我從JList的過程中單擊+拖動事件選擇項目時,點擊並拖動位置是可見的名單之外。

不知道我理解的要求。讓我們從選中的第一行開始。

如果您單擊第一行然後繼續拖動到第二行,第二行將被突出顯示。繼續拖動,第三行突出顯示。繼續拖過第三排,你想要發生什麼?

你是說你想要選擇第一行,因爲那是你開始的地方嗎?如果這是你所問的,那麼你需要看看BasicListUI。這是鼠標監聽器添加到JList的地方。您需要處理mousePressed事件以保存當前選定的行。那麼當你開始拖到最後一行之外時,你需要重寫mouseDragged代碼的默認行爲來重置選中的行。

我不知道如何做到這一切。

,我感到我加入到上面的方法

試圖重寫代碼,該方法「setSelectionInterval」的System.out的消息是爲時已晚。拖動鼠標時,選擇將繼續更新。您不知道是否正在調用此方法,因爲鼠標確實位於最後一行或最後一行,因爲您無權訪問鼠標點。

我想你可以嘗試使用MouseInfo類來確定這個方法被調用時鼠標的位置,但不知何故,當你選擇第一行時你仍然需要知道最初的拖動。我也不知道如何做到這一點。

+0

在第一行啓動鼠標,選擇第一個列表項,然後將其拖動到第二行,第二行選擇第二個列表項,第三行選擇相同。我喜歡所有這些功能,但是當鼠標拖到第三個列表項下時,我希望它不會選擇任何東西。我希望它只選擇鼠標實際懸停的項目。 我相當有信心,我可以處理它的編碼,但我不知道我應該在哪裏修改/添加代碼。 – 2013-04-21 06:58:45

+0

我認爲可以商定,我正在尋找添加/修改處理鼠標事件的代碼。再次閱讀您的文章,我想我會嘗試添加BasicListUI鼠標監聽器並從那裏開始。即使我到了一個死衚衕,感謝給我一個從何着手的想法。 – 2013-04-21 07:09:11

相關問題