2012-02-01 38 views
3

我有一個JListJScrollPane。如果我在JList中只有一件東西,則由於JScrollPane而會有空的空間。如果我點擊JList中的任何地方,它會點擊一個元素。有沒有辦法讓它只點擊元素,如果我真的點擊它?此外,我正在使用JList的自定義渲染器添加圖像,如果這與它有任何關係。Java - JList點擊

感謝

+0

爲了更好地提供幫助,請發佈[SSCCE](http://sscce.org/)。 – 2012-02-02 01:05:48

回答

4

您可以檢查通過locationToIndex被點擊的索引。

返回最接近列表的 座標系中給定位置的單元索引。要確定單元格是否實際包含指定位置,請將點與單元格的邊界進行比較,如getCellBounds提供的 。如果型號爲 爲空,此方法返回-1

+0

那會做什麼? – Stripies 2012-02-01 23:44:03

+0

@JonMannerberg,這將允許您篩選選擇並確定選擇是否「合法」。 – mre 2012-02-01 23:45:49

+0

當'JList'中至少有一個元素時,'locationToIndex'總是返回> -1。 – Stripies 2012-02-01 23:51:42

1

不知道這是否符合你的情況,但你可以嘗試List.isFileList屬性:

list.putClientProperty("List.isFileList", Boolean.TRUE); 

這將迫使ListUI,以確保該點是一個列表項的實際範圍內(見SwingUtilities2.loc2IndexFileList) 。

但是,設置此屬性可能會改變列表的外觀。

3

這可以幫助你。

public class JListOperations extends javax.swing.JFrame { 
    private static final long serialVersionUID = 1L; 
    private javax.swing.JScrollPane jsp = null; 
    private javax.swing.JList<java.lang.String> jl = null; 
    public JListOperations(){ 
     super();  
    } 
    public void initialiseComponents(){ 
     jl = new javax.swing.JList<java.lang.String>(new java.lang.String[]{"Item 1"}); 
     /* 
     * Add mouse listener which checks if the mouse click point is on the item. If not deselect the item 
     */ 
     jl.addMouseListener(new java.awt.event.MouseAdapter(){ 
      public void mouseClicked(java.awt.event.MouseEvent mouseEvent){ 
       if (!jl.getCellBounds(jl.getSelectedIndex(), jl.getSelectedIndex()).contains(mouseEvent.getPoint())){ 
        jl.removeSelectionInterval(jl.getSelectedIndex(), jl.getSelectedIndex()); 
       } 
       java.lang.System.out.println(jl.getSelectedIndex()); 
      } 
     }); 
     jsp = new javax.swing.JScrollPane(jl); 
     getContentPane().add(jsp); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 
    public static void main(java.lang.String args[]){ 
     JListOperations jlopFrame = new JListOperations(); 
     jlopFrame.initialiseComponents(); 
     jlopFrame.pack(); 
     jlopFrame.setVisible(true); 
    } 
}