2010-07-28 3 views
1

У меня есть эта проблема. В пользовательском JTree я реализовал JPopupMenu для отображения другого JMenuItem в соответствии с выбранным узлом с помощью MouseListener. JPopupMenu отображается при щелчке правой кнопкой мыши. Проблема в том, что если я не выберу Item из PopupMenu, но вместо этого я выбираю другой узел в дереве, либо с правой, либо с левой кнопкой, это событие никогда не попадает в дерево. MouseListener Может ли кто-нибудь указать мне в правильном направлении решить это? В случае, если будет доступен пример, я буду признателен. Спасибо.Проблема с JPopupMenu в JTree

+1

не может воспроизвести (с помощью jdk6u27): mouseEvents достигает слушателя, установленного на дереве, независимо от того, является ли всплывающее окно видимым или нет. Так может быть ошибка в ядре теперь исправлена ​​или ошибка в коде, который вы не показывали :-) – kleopatra

ответ

1

Я бы предположил, что, возможно, используя TreeSelectionListener для определения изменений в выбранном узле, в отличие от MouseListener, и повторного заполнения JPopupMenu в этот момент, но это ваш выбор.

Пытаясь подражать вашему примеру, мне было интересно, какие методы вы переопределили в слушателе мыши? В этом простом примере слушатель, кажется, получает события независимо от того, отображается ли всплывающее меню или нет.

EDIT - см. Мой комментарий ниже, но правый щелчок, не выбирающий узел, является поведением по умолчанию. В этом примере выберем ближайший узел, где был бы сделан правый щелчок.

public class SampleTree extends JFrame { 
    private JPopupMenu menu = new JPopupMenu("Popup"); 

    public SampleTree() throws HeadlessException { 
     super("Tree"); 
     final JTree tree = new JTree(); 

     tree.addMouseListener(new MouseAdapter() { 
      public void mouseReleased(MouseEvent e) { 
       if (e.isPopupTrigger()) { 
        TreePath tp = tree.getClosestPathForLocation(e.getX(),e.getY()); 
        if (tp != null) { 
         System.out.println(tp); 
         tree.setSelectionPath(tp); 
        } 
        menu.show(e.getComponent(), e.getX(), e.getY()); 
       } 
      } 
     }); 

     String letters = "ABCDEF"; 

     for (final char letter : letters.toCharArray()) { 
      JMenuItem item = new JMenuItem(String.valueOf(letter)); 
      item.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        JOptionPane.showMessageDialog(SampleTree.this, "You chose the letter: " + letter); 
       } 
      }); 
      menu.add(item); 
     } 

     add(new JScrollPane(tree)); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       SampleTree st = new SampleTree(); 
       st.setSize(200, 200); 
       st.setLocationRelativeTo(null); 
       st.setVisible(true); 
      } 
     }); 
    } 
} 
+0

Спасибо за повторное воспроизведение К вашему предложению могу сказать, что я начал оценивать TreeSelectionListener, но TreeSelectionEvent не имеет способа определить нажата кнопка мыши. Что касается вашего примера, очень похоже на мой, мы оба переопределяем методы MouseReleased и MousePressed, хотя в вашем случае левая кнопка ведет себя так, как ожидалось, что правая кнопка по-прежнему работает, как я описал, MousePressed и MousseClicked не получают событие, если popupMenu все еще видно. Если вы нашли решение, отправьте его С уважением – Alex

+0

Я считаю, что это поведение по умолчанию для JTree теперь основано на этом отчете об ошибке: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4196497. Я изменил свой пример, чтобы продемонстрировать, как вы могли бы сделать это программно, выбрав узел правой кнопкой мыши. – jridley