MouseListener и JTree

Я использую прослушиватель мыши, чтобы узнать, когда пользователь нажимает на узлы JTree. Хотя, когда пользователь нажимает стрелку для расширения узла (просмотра дочерних элементов), возникает следующее исключение:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at Core.ChannelView$1.mousePressed(ChannelView.java:120)
    at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:263)
    at java.awt.Component.processMouseEvent(Component.java:6370)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)

Слушатель ChannelView:

MouseListener ml = new MouseAdapter() {

            public void mousePressed(MouseEvent e) {
                TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
                if (e.getClickCount() == 1) {
line 120>>>>>        System.out.println(selPath.getLastPathComponent());

                } else if (e.getClickCount() == 2) {
                    System.out.println("Double" +selPath.getLastPathComponent());
                }
            }
        };
        tree.addMouseListener(ml);

Любые предложения о том, как я должен обрабатывать этот случай? Должен ли я просто попытаться поймать внутри оператора if? Кроме того, это хороший способ проверить двойные щелчки или я должен делать это другим методом? Спасибо


person Giannis    schedule 26.12.2011    source источник


Ответы (2)


Ваш слушатель пытается получить узел в месте расположения мыши. Если узла нет, tree.getPathForLocation() возвращает null. Просто проверьте, является ли selPath нулевым, прежде чем вызывать для него метод:

if (selPath == null) {
    System.out.println("No node at this location");
}
else {
    if (e.getClickCount() == 1) {
    ...
}

И да, getClickCount() возвращает количество кликов, связанных с событием, поэтому представляется целесообразным проверить, является ли это двойным кликом или простым.

person JB Nizet    schedule 26.12.2011

Я использую прослушиватель мыши, чтобы узнать, когда пользователь нажимает на узлы JTree.

Используйте TreeSelectionListener вместо этого. В TreeSelectionEvent есть несколько очень полезных < href="http://docs.oracle.com/javase/7/docs/api/javax/swing/event/TreeSelectionEvent.html#method_summary" rel="nofollow">методы для определения того, какие узлы были / выбраны.

См. раздел Как использовать деревья — реакция на выбор узла. подробнее.

person Andrew Thompson    schedule 27.12.2011
comment
Я проверил этот слушатель и реализовал его, но не смог найти, как проверить двойной щелчок. Возможно ли это? - person Giannis; 27.12.2011