⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cascadecombobox.java

📁 树型选择Java组合框
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package com;

/*
 *  文件名:         CascadeComboBox.java
 *  描述信息:
 *  作者:               张磊(rockis@msn.com)
 *  创建时间:       2004-8-12
 *  修改纪录:		  $Id: CascadeComboBox.java,v 1.6 2004/08/30 06:27:19 zhanglei Exp $
 */
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.HashMap;

import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.ListCellRenderer;
import javax.swing.MenuSelectionManager;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import javax.swing.plaf.ComboBoxUI;
import javax.swing.plaf.basic.BasicMenuItemUI;
import javax.swing.plaf.basic.ComboPopup;
import javax.swing.plaf.metal.MetalComboBoxUI;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

import com.sun.java.swing.plaf.motif.MotifComboBoxUI;
import com.sun.java.swing.plaf.windows.WindowsComboBoxUI;


/**
 *
 */
public class CascadeComboBox extends JComboBox
{
    TreeModel treeModel = null;
    TreeCellRenderer cellRenderer = new DefaultTreeCellRenderer();
    boolean showPathOnSelected = false;
    HashMap nodesMap = new HashMap();
    public CascadeComboBox()
    {
        this(new DefaultTreeModel(new DefaultMutableTreeNode("Test")));
    }

    public CascadeComboBox(TreeModel treeModel)
    {
        setTreeModel(treeModel);
        JTextField textField = ((JTextField)this.getEditor().getEditorComponent());
        textField.addKeyListener(new KeyAdapter(){
            public void keyReleased(KeyEvent e){
                if(e.getKeyCode() == KeyEvent.VK_ENTER){
                }
            }
        });
    }

    public void setTreeModel(TreeModel treeModel)
    {
        TreeModel oldModel = this.treeModel;
        this.treeModel = treeModel;
        firePropertyChange("treeModel", oldModel, this.treeModel);
        setModel(new DefaultComboBoxModel());
        if (treeModel != null)
        {
            Object root = treeModel.getRoot();
            saveComboBoxData(root);
        }
    }
    
    public void showPathOnSelected(boolean b)
    {
        boolean oldValue = showPathOnSelected;
        this.showPathOnSelected = b;
        firePropertyChange("showPathOnSelected", new Boolean(oldValue), new Boolean(b));
    }

    private void saveComboBoxData(Object node)
    {
        ((DefaultComboBoxModel)getModel()).addElement(node);
        Object uobj = node;
        if (node instanceof DefaultMutableTreeNode)
        {
            uobj = ((DefaultMutableTreeNode)node).getUserObject();
        }
        nodesMap.put(uobj, node);
        if (!treeModel.isLeaf(node))
        {
            for (int i = 0; i < treeModel.getChildCount(node); i++)
            {
                Object child = treeModel.getChild(node, i);
                saveComboBoxData(child);
            }
        }
    }

    public Object getSelectedObject()
    {
        Object obj = getSelectedItem();
        return nodeToObject(obj);
    }
    
    private Object nodeToObject(Object node)
    {
        if (node instanceof DefaultMutableTreeNode)
        {
            return ((DefaultMutableTreeNode)node).getUserObject();
        }else{
            return node;
        }
    }

    public void setSelectedItem(Object o)
    {
        getModel().setSelectedItem(o);
    }
    
    public void setSelectedObject(Object node)
    {
        Object o = nodesMap.get(node);
        getModel().setSelectedItem(o);
    }
    
    protected void selectedItemChanged() {
        Object oldItem = selectedItemReminder;
        super.selectedItemChanged();
        Object newItem = selectedItemReminder;
        firePropertyChange("itemChange", nodeToObject(oldItem), nodeToObject(newItem));
    }
    
    public void setCellRenderer(TreeCellRenderer x)
    {
        TreeCellRenderer oldRenderer = cellRenderer;
        this.cellRenderer = x;
        firePropertyChange("cellRenderer", oldRenderer, cellRenderer);
    }

    public TreeCellRenderer getCellRenderer()
    {
        return this.cellRenderer;
    }

    public TreeModel getTreeModel()
    {
        return this.treeModel;
    }

    public void updateUI(){
        ComboBoxUI cui = (ComboBoxUI)UIManager.getUI(this);
        if(cui instanceof MetalComboBoxUI){
            cui = new MetalCascadeComboBoxUI();
        } else if(cui instanceof MotifComboBoxUI){
            cui = new MotifCascadeComboBoxUI();
        } else if(cui instanceof WindowsComboBoxUI){
            cui = new WindowsCascadeComboBoxUI();
        }
        setUI(cui);
    }
    interface TreePopupComboBoxUI
    {
        TreePopup getTreePopup();
    }
    // UI Inner classes -- one for each supported Look and Feel
    class MetalCascadeComboBoxUI extends MetalComboBoxUI implements TreePopupComboBoxUI{
        TreePopup treePopup = new TreePopup(CascadeComboBox.this);
        protected ComboPopup createPopup(){
            CascadeComboBox.this.addPropertyChangeListener(treePopup);
            return treePopup;
        }
        protected ListCellRenderer createRenderer()
        {
            return new CascadeComboBoxRenderer();
        }
        public TreePopup getTreePopup()
        {
            return treePopup;
        }
    }

    class WindowsCascadeComboBoxUI extends WindowsComboBoxUI implements TreePopupComboBoxUI{
        TreePopup treePopup = new TreePopup(CascadeComboBox.this);
        protected ComboPopup createPopup(){
            CascadeComboBox.this.addPropertyChangeListener(treePopup);
            return treePopup;
        }
        protected ListCellRenderer createRenderer()
        {
            return new CascadeComboBoxRenderer();
        }
        public TreePopup getTreePopup()
        {
            return treePopup;
        }
    }

    class MotifCascadeComboBoxUI extends MotifComboBoxUI  implements TreePopupComboBoxUI{
        TreePopup treePopup = new TreePopup(CascadeComboBox.this);
        protected ComboPopup createPopup(){
            CascadeComboBox.this.addPropertyChangeListener(treePopup);
            return treePopup;
        }
        protected ListCellRenderer createRenderer()
        {
            return new CascadeComboBoxRenderer();
        }
        public TreePopup getTreePopup()
        {
            return treePopup;
        }
    }
    
    class CascadeComboBoxRenderer extends DefaultListCellRenderer
    {
        String SEPARATOR = "/"; 
        public Component getListCellRendererComponent(
                        JList list,
                        Object value,
                        int index,
                        boolean isSelected,
                        boolean cellHasFocus)
        {
            CascadeComboBox comboBox = CascadeComboBox.this;
            JLabel lb = (JLabel)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            if (value == null) 
            {
                comboBox.setToolTipText(null);
                return lb;
            }
            ComboBoxUI ui = comboBox.getUI();
            if (ui instanceof TreePopupComboBoxUI)
            {
                TreePopupComboBoxUI tui = (TreePopupComboBoxUI)ui;
                JTree tree = tui.getTreePopup().getTree();
                boolean isLeaf = tree.getModel().isLeaf(value);
                JLabel r = (JLabel)cellRenderer.getTreeCellRendererComponent(tui.getTreePopup().getTree()
                                , value, false, true, isLeaf, 0, false);
                lb.setIcon(r.getIcon());
                lb.setEnabled(comboBox.isEnabled());
                String label = getText((TreeNode)value);
                lb.setText(label);
                comboBox.setToolTipText(label);
            }
            return lb;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -