2010-07-28 4 views
1

이 문제가 있습니다. 커스텀 JTree에서는, JPopupMenu를 구현해, MouseListener를 사용해 선택된 노드에 따라 다른 JMenuItem를 표시합니다. 마우스 오른쪽 버튼을 클릭하면 JPopupMenu가 표시됩니다. 문제는 내가 PopupMenu에서 항목을 선택하지 않고 오른쪽 또는 왼쪽 단추를 사용하여 트리의 다른 노드를 선택하면 트리 MouseListener에 의해이 이벤트가 결코 잡히지 않는다는 것입니다. 아무도 올바른 방향으로 나를 가리킬 수 있습니까? 이 문제를 해결하려면? 예를 사용할 수있는 경우 감사하겠습니다. 감사합니다. .JTree의 JPopupMenu와 관련된 문제

+1

(jdk6u27로) 재현 할 수 없습니다. 그래서 지금 수정 된 핵심 버그 또는 표시되지 않은 코드의 버그 일 수 있습니다. – kleopatra

답변

1

아마도 MouseListener와 반대되는 선택된 노드의 변경 사항을 확인하고 그 시점에서 JPopupMenu를 다시 채우는 TreeSelectionListener를 사용하는 것이 좋습니다.하지만 그건 선택 사항입니다.

예를 에뮬레이트하려고 할 때 어떤 방법을 마우스 수신기에서 무시했는지 궁금합니다. 이 간단한 예제에서, 리스너는 팝업 메뉴가 표시되는지 여부에 관계없이 이벤트를받는 것처럼 보입니다.

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