2013-07-04 2 views
1

상황에 약간의 두통이 있습니다. 어쩌면 당신 중 일부는 이전에이 문제를 겪어 왔고 또 다른 방법으로, 아니면 내 실수를 저에게 보여줄 수 있습니다.사용자 정의 JComboBox 숨기기 JPopupMenu

JComboBox 안에 JTree를 추가해야하며 아래 코드는 매력처럼 작동합니다.

public class HierarchyComboBox extends JComboBox { 
    HierarchyTree ht = new HierarchyTree(); 
    HierarchyComboBox box; 
    JPopupMenu popup; 
    MouseAdapter adapter = new MouseAdapter() { 
     @Override 
     public void mouseClicked(MouseEvent arg0) { 
      if (arg0.getClickCount() == 1) { 
       removeAllItems(); 
       addItem(ht.getSelectedLevel()); 
//    ((JPopupMenu) comp).setVisible(false); 
      } 
     } 
    }; 


    PopupMenuListener listener = new PopupMenuListener() { 
     @Override 
     public void popupMenuWillBecomeVisible(PopupMenuEvent e) { 
      if (box == null) { 
       box = (HierarchyComboBox) e.getSource(); 
       if (popup == null) { 
        final Object comp = box.getUI().getAccessibleChild(box, 0); 
        if (!(comp instanceof JPopupMenu)) 
         return; 
        popup = (JPopupMenu) comp; 
       } 
       popup.removeAll(); 
       ht.getTreePane().setBorder(null); 
       ht.getTreePane().setPreferredSize(new Dimension(box.getWidth(), 200)); 
       MyTree tree = (MyTree)ht.getTreePane().getViewport().getComponent(0); 
       tree.addMouseListener(adapter); 
       popup.add(ht.getTreePane()); 
      } 
     } 
     @Override 
     public void popupMenuCanceled(PopupMenuEvent arg0) { } 
     @Override 
     public void popupMenuWillBecomeInvisible(PopupMenuEvent arg0) { } 
    }; 

    public HierarchyComboBox() { 
     setEditable(true); 
     addPopupMenuListener(listener); 
    } 
} 

하지만이 구성 요소를 2 개의 다른 대화 상자에 추가했습니다.
내가 클릭 할 수 있습니다 첫 번째와 선택은 정확히 같은 인스턴스를하고, JComboBox에

두 번째에 추가되고, 같은 시험

구성 요소가 다른 행동이 있습니다
일 - JPopupMenu를 사라
- 선택 항목을 콤보에 추가하지 않습니다.

여기에 어떤 아이디어가 있습니까?
미리 감사드립니다.

답변

2

Providing a Custom Renderer에 표시된 것처럼 "콤보 상자는 렌더러를 사용하여 메뉴에 각 항목을 표시합니다." 은 사용자 정의의 트리를 렌더링 할 수 있습니다. ListCellRenderer. 또는

  • ActionListener에 대한 응답으로 인접 구성 요소의 트리를 렌더링합니다.

  • here으로 표시된 계층 적 모델을 사용하십시오.

+0

이 경우 트리 하나를 하나의 옵션으로 렌더링합니다. 니가 말하는거야? –

+0

예,하지만 다른 구성 요소로 팝업 방식을 선호합니다. – trashgod

+0

정확합니다. 나는 그 문제를 해결했다. 하지만 답을 주셔서 감사합니다. @trashgod –

1

JPopupMenu가 포커스를 잃고있는 것으로 나타났습니다.

해결 방법은 구성 요소를 패널의 마지막 구성 요소로 추가하는 것이 었습니다.

+0

관련 [예제] (http://stackoverflow.com/a/3591230/230513)도 참조하십시오. – trashgod

+1

예, 할 수는 있지만 지금은 아닙니다. 그것은 나에게 2 일을 기다려야한다고 말한다. 2 일 후에 답변을 수락 할 수 있습니다. –

관련 문제