2012-02-01 2 views
3

У меня есть JList с JScrollPane. Если у меня есть только одна вещь в JList, будет пустое место из-за JScrollPane. Если я нахожусь в любом месте в JList, он нажимает на один элемент. Есть ли способ сделать это, только щелкнуть элемент, если я на самом деле нажму? Кроме того, я использую собственный рендерер для JList, чтобы добавить изображения, если это имеет к этому какое-либо отношение.Java - JList Нажав

Благодаря

+0

Для лучшей помощи в ближайшее время опубликуйте [SSCCE] (http://sscce.org/). –

ответ

4

Вы можете проверить индекс, который щелкнул через locationToIndex.

Возвращает индекс ячейки, ближайший к данному местоположению, в системе координат . Для того, чтобы определить, является ли клетка на самом деле содержит указанное место, сравните точку против границ в клеточных, так как предоставленной getCellBounds. Этот метод возвращает -1, если модель пустая.

+0

Что бы это сделало? – Stripies

+0

@JonMannerberg. Это позволит вам отфильтровать выбор и определить, является ли выбор «законным». – mre

+0

'locationToIndex' всегда возвращает> -1, когда в' JList' есть хотя бы один элемент. – Stripies

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); 
    } 
}