Java - клик JList - PullRequest
       7

Java - клик JList

3 голосов
/ 02 февраля 2012

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

Спасибо

Ответы [ 3 ]

4 голосов
/ 02 февраля 2012

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

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

3 голосов
/ 02 февраля 2012

Это может помочь вам.

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);
    }
}
1 голос
/ 02 февраля 2012

Не уверен, подходит ли это вашему случаю, но вы можете попробовать List.isFileList свойство:

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

Это заставит ListUI убедиться, что точка находится в пределах фактических границ элемента списка (см. SwingUtilities2.loc2IndexFileList ).

Однако настройка этого свойства может изменить внешний вид вашего списка.

...