1

状況で少し頭が痛いです。たぶん、あなたの何人かは以前にこれを経験したことがあり、別の方法やここでの私のエラーさえも教えてくれます.

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 に追加されます

2 つ目は、まったく同じインスタンス化と同じテストを実行し

ます コンポーネントの動作が異なります:
- JPopupMenu が消えます
- コンボに選択が追加されません

ここに何かアイデアはありますか?
前もって感謝します..

4

2 に答える 2

2

カスタム レンダラーの提供 に示されているように、「コンボ ボックスはレンダラーを使用して各項目をメニューに表示します。」カスタム でツリーをレンダリングできますListCellRenderer。あるいは、

  • に応答して、隣接するコンポーネントでツリーをレンダリングしますActionListener

  • ここに示す階層モデルを使用します。

于 2013-07-04T14:23:01.260 に答える