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

📄 jtpdesktoppane.java

📁 这也是我在论坛上看见的一个程序。感觉非常好
💻 JAVA
字号:
package com.sunking.tp.swing;

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
//import java.awt.geom.*;
import java.util.*;
import com.sunking.tp.tool.*;
import com.sunking.tp.framework.*;

/**
 *
 * <p>Title: </p>
 * <p>Description: 画图桌面</p>
 * <p>Copyright: Copyright (c) 2003</p>
 * <p>Company: </p>
 * @author <a href="mailto:sunkingxie@hotmail.com">SunKing</a>
 * @version 1.0
 */

public class JTPDesktopPane extends JPanel implements Desktop, java.io.Serializable {
    private static final long serialVersionUID = -3000000000000000009L;
    /**
     *
     */
//    BasicStroke stroke=new BasicStroke(1.0f,BasicStroke.CAP_BUTT,
//                                       BasicStroke.JOIN_ROUND,140.0f,new float[]{1.0f},150.0f);
    /**
     *拖动框
     */
    Rectangle dragRec = null;
    /**
     *当前选取的连线
     */
    AssoicatorLine selectedLine = null;
    /**
     *所有连线
     */
    AssoicatorLine assoicatorLines[] = null;
    /**
     *最大尺寸
     */
    Dimension maxSize = new Dimension(0, 0);
    /**
     *当前工具
     */
    Tool tool;
    /**
     *默认工具
     */
    transient Tool defaultTool;
    /**
     *右键弹出菜单生成器
     */
    transient JTPMenuFactory jtpMenuFactory;
    public JTPDesktopPane() {
        this.setLayout(null);
        setTool(getDefaultTool());
        setBackground(UIManager.getColor("Desktop.background"));
    }

    /**
     *添加鼠标监听器
     * @param l
     */
    public void addMouseInputListener(MouseInputListener l) {
        this.addMouseListener(l);
        this.addMouseMotionListener(l);
    }

    /**
     *移除鼠标监听器
     * @param l
     */
    public void removeMouseInputListener(MouseInputListener l) {
        this.removeMouseListener(l);
        this.removeMouseMotionListener(l);
    }

    /**
     *取得某点上的组件
     * @param p
     * @return
     */
    public JTPComponent getJTPComponent(Point p) {
        for (int i = 0; i < getComponentCount(); i++) {
            Component c = getComponent(i);
            Point p1 = SwingUtilities.convertPoint(this, p, c);
            if ( (c instanceof JTPComponent) && c.contains(p1)) {
                return (JTPComponent) c;
            }
        }
        return null;
    }

    /**
     *取得当前选取的组件
     * @return
     */
    public JTPComponent[] getSelectionJTPComponent() {
        Vector vSelection = new Vector();
        for (int i = 0; i < getComponentCount(); i++) {
            Component c = getComponent(i);
            if (c instanceof JTPComponent) {
                JTPComponent tc = (JTPComponent) c;
                if (tc.isSelected()) {
                    vSelection.add(tc);
                }
            }
        }
        JTPComponent tpc[] = new JTPComponent[vSelection.size()];
        vSelection.copyInto(tpc);
        return tpc;
    }

    /**
     *添加选取的组件
     * @param c
     */
    public void addSelection(JTPComponent c) {
        c.setSelect(true);
    }

    /**
     *移除选取的组件
     * @param c
     */
    public void removeSelection(JTPComponent c) {
        c.setSelect(false);
    }

    /**
     *设置工具
     * @param t
     */
    public void setTool(Tool t) {
        getDefaultTool().disabledTool();
        if (tool != null) {
            tool.disabledTool();
        }
        this.tool = t;
        if (t != null) {
            t.enabledTool();
        } else {
            getDefaultTool().enabledTool();
        }
        repaint();
    }

    /**
     *取得当前工具
     * @return
     */
    public Tool getTool() {
        if (tool != null) {
            return tool;
        }
        return getDefaultTool();
    }

    /**
     *取得默认工具
     * @return
     */
    public Tool getDefaultTool() {
        if (defaultTool == null) {
            defaultTool = new SelectionTool(this);
        }
        return defaultTool;
    }

    /**
     *激发连接器更新
     */
    public void fireAssoicatorChanged() {
        assoicatorLines = getAssoicatorLines();
        this.setPreferredSize(maxSize);
        repaint();
        if (getParent() != null) {
            getParent().doLayout();
        }
    }

    /**
     *鼠标点击选取
     * @param p
     */
    public void mouseSelect(Point p) {
        selectedLine = null;
        JTPComponent tp = getJTPComponent(p);
        if (tp != null) {
            tp.setSelect(true);
        } else {
            if (assoicatorLines != null && p != null) {
                for (int i = 0; i < assoicatorLines.length; i++) {
                    if (assoicatorLines[i].contains(p)) {
                        selectedLine = assoicatorLines[i];
                    }
                }
            }
        }
        repaint();
    }

    /**
     *鼠标拉框选取
     * @param rec
     */

    public void mouseSelect(Rectangle rec) {
        dragRec = rec;
        if (dragRec == null) {
            repaint();
            return;
        }
        for (int i = 0; i < getComponentCount(); i++) {
            Component c = getComponent(i);
            if (c instanceof JTPComponent) {
                if (c.getBounds().intersects(rec)) {
                    ( (JTPComponent) c).setSelect(true);
                    selectedLine = null;
                } else {
                    ( (JTPComponent) c).setSelect(false);
                }
            }
        }
        repaint();
    }

    /**
     *清除全部选取
     */
    public void clearSelection() {
        for (int i = 0; i < getComponentCount(); i++) {
            if (getComponent(i)instanceof JTPComponent) {
                JTPComponent c = (JTPComponent) getComponent(i);
                c.setSelect(false);
            }
        }
        selectedLine = null;
        repaint();
    }

    /**
     *删除当前选取
     */
    public void deleteSelection() {
        if (selectedLine != null) {
            selectedLine.source.removeAssociator(selectedLine.dest);
            selectedLine.dest.removeAssociator(selectedLine.source);
            selectedLine = null;
        } else {
            for (int i = getComponentCount() - 1; i >= 0; i--) {
                if (getComponent(i)instanceof JTPComponent) {
                    JTPComponent c = (JTPComponent) getComponent(i);
                    if (c.isSelected()) {
                        remove(c);
                        remove(i);
                        //break;
                    }
                }
            }
        }
        fireAssoicatorChanged();
    }
    /**
     * 取得当前选取的连线
     * @return
     */
    public AssoicatorLine getSelectionLine(){
        return selectedLine;
    }

    /**
     *移除组件
     * @param c
     */
    public void remove(JTPComponent c) {
        if (assoicatorLines != null) {
            for (int i = 0; i < assoicatorLines.length; i++) {
                AssoicatorLine line = assoicatorLines[i];
                if (line.source == c || line.dest == c) {
                    line.source.removeAssociator(line.dest);
                    line.dest.removeAssociator(line.source);
                }
            }
        }
    }

    /**
     *绘制组件及其选取状态\拉框选取时的框线
     * @param g
     */
    public void paintChildren(Graphics g) {
        if (assoicatorLines != null) {
            for (int i = 0; i < assoicatorLines.length; i++) {
                assoicatorLines[i].drawLine(g);
            }
        }
        if (selectedLine != null) {
            selectedLine.drawHandle(g);
        }
        super.paintChildren(g);
//        Graphics2D g2=(Graphics2D)g;
//        g2.setStroke(stroke);
//        g2.setXORMode(getParent().getBackground());
        if (dragRec != null) {
            Color c = getBackground();
            g.setColor(new Color(255 - c.getRed(), 255 - c.getGreen(), 255 - c.getBlue()));
            g.drawRect(dragRec.x, dragRec.y, dragRec.width, dragRec.height);
        }
    }

    /**
     *取得当前所有的连线
     * @return
     */
    public AssoicatorLine[] getAssoicatorLines() {
        maxSize = new Dimension(0, 0);
        Vector vec = new Vector();
        for (int i = 0; i < getComponentCount(); i++) {
            Component com = getComponent(i);
            if (com instanceof JTPComponent) {
                JTPComponent c = (JTPComponent) getComponent(i);
                Assoicator ass[] = c.getAssociator();
                if (ass != null) {
                    for (int j = 0; j < ass.length; j++) {
                        vec.add(new AssoicatorLine(c, ass[j]));
                    }
                }
            }
            maxSize.setSize(Math.max(maxSize.getWidth(), com.getX() + com.getWidth() + 10),
                Math.max(maxSize.getHeight(), com.getY() + com.getHeight() + 10));
        }
        if (vec.size() == 0)
            return null;
        AssoicatorLine lines[] = new AssoicatorLine[vec.size()];
        vec.copyInto(lines);
        return lines;
    }

    /**
     *设置右键菜单生成器
     * @param f
     */
    public void setJTPMenuFactory(JTPMenuFactory f) {
        jtpMenuFactory = f;
    }

    /**
     *取得右键菜单生成器
     * @return
     */
    public JTPMenuFactory getJTPMenuFactory() {
        if (jtpMenuFactory == null) {
            jtpMenuFactory = JTPDefaultMenuFactory.getDefault();
        }
        return jtpMenuFactory;
    }
    /**
     * 调入画图桌面
     * @param desk
     */
    public void loadDesktop(Object d) throws Exception{
        this.removeAll();
        JTPDesktopPane desk = (JTPDesktopPane)d;
        Vector v = new Vector();
        for (int i = 0; i < desk.getComponentCount(); i++) {
            Component c = desk.getComponent(i);
//            add(c);
//这里有一个BUG,当不用Vector先存储时,直接进行add(c),会出现丢失组件的错误
//不知道是什么原因.它也不会报错.
            v.add(c);
        }
        for (int i = 0; i < v.size(); i++) {
            add((Component)v.get(i));
        }
        this.dragRec = desk.dragRec;
        this.selectedLine = desk.selectedLine;
        this.assoicatorLines = desk.assoicatorLines;
        this.maxSize = desk.maxSize;
        fireAssoicatorChanged();
    }
}

⌨️ 快捷键说明

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