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

📄 componenttree.java

📁 SWING的界面UI包 SWING的界面UI包
💻 JAVA
字号:
/*
 * ComponentTree.java
 *
 * Created on 2007年8月11日, 下午9:39
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package dyno.swing.designer.treeview;

import dyno.swing.designer.beans.AdapterBus;
import dyno.swing.designer.beans.ComponentAdapter;
import dyno.swing.designer.beans.SwingDesigner;
import dyno.swing.designer.beans.Util;
import dyno.swing.designer.beans.events.DesignerEditAdapter;
import dyno.swing.designer.beans.events.DesignerEvent;
import dyno.swing.designer.beans.events.HotKeyProxy;
import java.awt.Component;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.DropMode;
import javax.swing.JPopupMenu;
import javax.swing.JTree;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;


/**
 *
 * @author William Chen
 */
public class ComponentTree extends JTree {

    private SwingDesigner designer;
    private ComponentTreeModel model;
    private ArrayList<ComponentTreeListener> listeners = new ArrayList<ComponentTreeListener>();
    private KeyListener hotKeyProxy;

    /** Creates a new instance of ComponentTree */
    public ComponentTree(SwingDesigner designer) {
        this.designer = designer;
        setRootVisible(true);
        setCellRenderer(new ComponentTreeCellRenderer(designer));
        getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
        this.setDragEnabled(true);
        this.setDropMode(DropMode.ON_OR_INSERT);
        this.setTransferHandler(new TreeTransferHandler(designer));
        if (hotKeyProxy != null) {
            this.removeKeyListener(hotKeyProxy);
        }
        hotKeyProxy = new HotKeyProxy(designer);
        this.addKeyListener(hotKeyProxy);
        this.refreshTreeRoot();
        addTreeSelectionListener(designer);
        addComponentTreeListener(designer);
        designer.addDesignerEditListener(new TreeDesignerEditAdapter());
        this.addMouseListener(new MouseAdapter() {

            public void mouseClicked(MouseEvent e) {
                if (e.isPopupTrigger()) {
                    popupMenu(e);
                }
            }

            public void mousePressed(MouseEvent e) {
                if (e.isPopupTrigger()) {
                    popupMenu(e);
                }
            }

            public void mouseReleased(MouseEvent e) {
                if (e.isPopupTrigger()) {
                    popupMenu(e);
                }
            }
        });
        setEditable(true);
    }
    public boolean isPathEditable(TreePath path) {
        Object object=path.getLastPathComponent();
        if(object==designer.getRootComponent())
            return false;
        return super.isPathEditable(path);
    }
    public String convertValueToText(Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
        if (value != null && value instanceof Component) {
            return Util.getComponentName((Component) value);
        } else {
            return super.convertValueToText(value, selected, expanded, leaf, row, hasFocus);
        }
    }

    private void popupMenu(MouseEvent e) {
        TreePath path = this.getSelectionPath();
        if (path == null) {
            return;
        }
        Component component = (Component) path.getLastPathComponent();
        if (component == null) {
            return;
        }
        ComponentAdapter adapter = AdapterBus.getComponentAdapter(designer, component);
        JPopupMenu menu = adapter.getContextPopupMenu(e);
        menu.show(this, e.getX(), e.getY());
    }

    public void refreshUI() {
        updateUI();
    }

    private class TreeDesignerEditAdapter extends DesignerEditAdapter {

        public void componentEdited(DesignerEvent evt) {
            ComponentTree.this.refreshUI();
            ComponentTree.this.repaint();
        }

        public void componentSelected(DesignerEvent evt) {
            ArrayList<Component> components = designer.getSelectionModel().getSelectedComponents();
            TreePath[] paths = new TreePath[components.size()];

            for (int i = 0; i < paths.length; i++) {
                paths[i] = buildTreePath(components.get(i));
            }

            setSelectionPaths(paths);
        }
    }

    public void addComponentTreeListener(ComponentTreeListener l) {
        if (!listeners.contains(l)) {
            listeners.add(l);
        }
    }

    public void removeComponentTreeListener(ComponentTreeListener l) {
        if (listeners.contains(l)) {
            listeners.remove(l);
        }
    }

    public void fireTreeChanged() {
        ComponentTreeEvent evt = new ComponentTreeEvent(this);

        for (ComponentTreeListener l : listeners) {
            l.treeChanged(evt);
        }
    }

    public void refreshTreeRoot() {
        model = new ComponentTreeModel(designer, designer.getRootComponent());
        setModel(model);
        setDragEnabled(true);
        setDropMode(DropMode.ON_OR_INSERT);
        setTransferHandler(new TreeTransferHandler(designer));
        repaint();
    }

    private TreePath buildTreePath(Component comp) {
        ArrayList<Component> path = new ArrayList<Component>();
        Component parent = comp;

        while (parent != null) {
            if (Util.isDesigning(parent)) {
                path.add(0, parent);
            }

            parent = parent.getParent();
        }

        Object[] components = path.toArray();

        return new TreePath(components);
    }
}

⌨️ 快捷键说明

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