JAVA--好友界面面板

package GongYou;

//package windows.best_demo;

import java.awt.*;   
import javax.swing.*;   
import java.util.*;   
import java.awt.event.*;   
   
/**  
 * <P>Title:OpenSwing </P>  
 * <P>Description: JGroupPanel 组群面板   
 *  类似QQ界面的组群管理面板  
 * </P>  
 * 履历:   
 *     2004/07/24   由SunKing作成   
 * <P>Copyright: Copyright (c) 2004</P>  
 * <P>Company: </P>  
 * @author <A href="mailto:sunkingxie@hotmail.com" mce_href="mailto:sunkingxie@hotmail.com" ?>Sunking</A>  
 * @version 1.0  
 */   
public class JGroupPanel   
    extends JPanel {   
    /*用来管理组的三个容器*/   
    private JPanel pNorth = new JPanel() {   
    };   
    private JPanel pCenter = new JPanel();   
    private JPanel pSouth = new JPanel();   
   
    /*当前全部组的集合*/   
    private ArrayList groupList = new ArrayList();   
   
    /*是否已禁止添加组件*/   
    private boolean forbidFlag = false;   
   
    /*当前激活的组*/   
    private JGroupContainer activeGroup = null;   
    transient ActionListener al = new ActionListener() {   
        public void actionPerformed(ActionEvent e) {   
            JButton bttTitle = (JButton) e.getSource();   
            expandGroup( (JGroupContainer) bttTitle.getParent());   
        }   
    };   
   
    private boolean hasCreateDefaultGroup = false;   
    public JGroupPanel() {   
        initComponents();   
        createDefaultGroup();   
    }   
    private void initComponents(){   
        this.setLayout(new BorderLayout());   
        this.add(pNorth, BorderLayout.NORTH);   
        this.add(pCenter, BorderLayout.CENTER);   
        this.add(pSouth, BorderLayout.SOUTH);   
        pNorth.setLayout(new GroupLayout());   
        pCenter.setLayout(new BorderLayout());   
        pSouth.setLayout(new GroupLayout());   
        forbidFlag = true;   
    }   
    private void createDefaultGroup(){   
        //Default Group    
        Color bg[] = {   
            Color.black, Color.red, Color.orange, Color.yellow, Color.green,   
            Color.cyan, Color.blue, Color.white};   
        for (int i = 1; i <= bg.length; i++) {   
            insertGroup(i - 1, "Group " + i, bg[i - 1]);   
            Color mc = new Color(255 - bg[i - 1].getRed(),   
                                 255 - bg[i - 1].getGreen(),   
                                 255 - bg[i - 1].getBlue());   
            for (int j = 1; j <= 5; j++) {   
                JButton bttMember = new JButton("Member " + j + " of " + i);   
                addMember(i - 1, bttMember);   
                bttMember.setPreferredSize(new Dimension(1, 40));   
                bttMember.setOpaque(false);   
                bttMember.setForeground(mc);   
            }   
            getGroup(i - 1).setMemberGap(20, 5);   
            getGroup(i - 1).getTitleButton().setForeground(bg[i - 1]);   
        }   
        expandGroup(0);   
        hasCreateDefaultGroup = true;   
    }   
   
    /**  
     * @param groupNames String[] 预设组名  
     */   
    public JGroupPanel(String groupNames[]) {   
        initComponents();   
        addGroup(groupNames);   
    }   
   
    /**  
     * 展开组  
     * @param name String 组名  
     */   
    public void expandGroup(String name) {   
        for (int i = getGroupCount() - 1; i >= 0; i--) {   
            if (getGroupName(i).equals(name)) {   
                expandGroup(i);   
            }   
        }   
    }   
   
    /**  
     * 展开组  
     * @param index int 组的顺序号  
     */   
    public void expandGroup(int index) {   
        expandGroup(getGroup(index));   
    }   
   
    /**  
     * 展开组  
     * @param group JGroupContainer 组  
     */   
    protected void expandGroup(JGroupContainer group) {   
        pNorth.removeAll();   
        pCenter.removeAll();   
        pSouth.removeAll();   
        boolean hasAddCenter = false;   
        for (int i = 0; i < groupList.size(); i++) {   
            Component c = (Component) groupList.get(i);   
            if (hasAddCenter) {   
                pSouth.add(c);   
            }   
            else if (c == group) {   
                pCenter.add(c, BorderLayout.CENTER);   
                hasAddCenter = true;   
            }   
            else {   
                pNorth.add(c);   
            }   
        }   
        if (activeGroup != null) {   
            activeGroup.collapse();   
        }   
        activeGroup = group;   
        activeGroup.expand();   
        pNorth.doLayout();   
        pCenter.doLayout();   
        pSouth.doLayout();   
        doLayout();   
    }   
   
    /**  
     * 收缩组  
     * @param name String 组名  
     */   
    public void collapseGroup(String name) {   
        for (int i = getGroupCount() - 1; i >= 0; i--) {   
            if (getGroupName(i).equals(name)) {   
                collapseGroup(i);   
            }   
        }   
    }   
   
    /**  
     * 收缩组  
     * @param index int 组的顺序号  
     */   
    public void collapseGroup(int index) {   
        collapseGroup(getGroup(index));   
    }   
   
    /**  
     * 收缩组  
     * @param group JGroupContainer 组  
     */   
    protected void collapseGroup(JGroupContainer group) {   
        if (group == activeGroup) {   
            activeGroup.collapse();   
            activeGroup = null;   
        }   
    }   
   
    /**  
     * 添加组  
     * @param name String 组名  
     */   
    public void addGroup(String name) {   
        this.insertGroup(getGroupCount(), name);   
    }   
   
    /**  
     * 添加多个组  
     * @param names String[] 组名  
     */   
    public void addGroup(String names[]) {   
        for (int i = 0; i < names.length; i++) {   
            addGroup(names[i]);   
        }   
    }   
   
    /**  
     * 插入一个组  
     * @param index int 顺序号  
     * @param name String 组名  
     * @param bg Color 背景色  
     */   
    public void insertGroup(int index, String name, Color bg) {   
        if (index < 0 || index > groupList.size()) {   
            throw new ArrayIndexOutOfBoundsException("index:" + index +   
                " >count:" + groupList.size());   
        }   
        if(hasCreateDefaultGroup){   
            while(getGroupCount()>0){   
                removeGroup(0);   
            }   
            hasCreateDefaultGroup = false;   
        }   
        int countNorth = pNorth.getComponentCount();   
        int countCenter = pCenter.getComponentCount();   
        int countSouth = pSouth.getComponentCount();   
        JGroupContainer group;   
        if (index <= countNorth) {   
            group = insertGroup(pNorth, index, name, bg);   
        }   
        else if (index <= countNorth + countCenter) {   
            group = insertGroup(pCenter, index - countNorth, name, bg);   
        }   
        else if (index <= countNorth + countCenter + countSouth) {   
            group = insertGroup(pSouth, index - countNorth - countCenter, name,   
                                bg);   
        }   
        else {   
            group = insertGroup(pSouth, countSouth, name, bg);   
        }   
        group.getTitleButton().addActionListener(al);   
        groupList.add(index, group);   
   
    }   
   
    /**  
     * 插入一个组  
     * @param index int 顺序号  
     * @param name String 组名  
     */   
    public void insertGroup(int index, String name) {   
        insertGroup(index, name, UIManager.getColor("Desktop.background"));   
    }   
   
    /**  
     * 插入一个组  
     * @param p JPanel 目标面板  
     * @param index int 顺序号  
     * @param name String 组名  
  
  
         /**  
      * 插入一个组  
      * @param p JPanel 目标面板  
      * @param index int 顺序号  
      * @param name String 组名  
      * @return JGroupContainer  
      */   
     private JGroupContainer insertGroup(JPanel p, int index, String name,   
                                         Color bg) {   
         JGroupContainer group = new JGroupContainer(name, bg);   
         p.add(group);   
         return group;   
     }   
   
    /**  
     * 删除一个组  
     * @param index int 顺序号  
     */   
    public void removeGroup(int index) {   
        JGroupContainer c = (JGroupContainer) groupList.get(index);   
        c.getParent().remove(c);   
        c.getTitleButton().removeActionListener(al);   
    }   
   
    /**  
     * 删除一个组  
     * @param name String 组名  
     */   
    public void removeGroup(String name) {   
        for (int i = getGroupCount() - 1; i >= 0; i--) {   
            if (getGroupName(i).equals(name)) {   
                this.removeGroup(i);   
            }   
        }   
    }   
   
    /**  
     * 设置组名  
     * @param index int 顺序号  
     * @param name String 组名  
     */   
    public void setGroupName(int index, String name) {   
        this.getGroup(index).setName(name);   
    }   
   
    /**  
     * 取得组名  
     * @param groupIndex int 顺序号  
     * @return String 组名  
     */   
    public String getGroupName(int groupIndex) {   
        return getGroup(groupIndex).getName();   
    }   
   
    /**  
     * 取得全部组名  
     * @return String[]  
     */   
    public String[] getGroupNames() {   
        String sResult[] = new String[getGroupCount()];   
        for (int i = 0; i < getGroupCount(); i++) {   
            sResult[i] = getGroupName(i);   
        }   
        return sResult;   
    }   
   
    /**  
     * 取得当前组的总数  
     * @return int  
     */   
    public int getGroupCount() {   
        return groupList.size();   
    }   
   
    /**  
     * 往组中添加成员组件  
     * @param groupIndex int 组的顺序号  
     * @param member Component 成员组件  
     */   
    public void addMember(int groupIndex, Component member) {   
        getGroup(groupIndex).addMember(getGroup(groupIndex).getMemberCount(),   
                                       member);   
    }   
   
    /**  
     * 往组中插入成员组件  
     * @param groupIndex int 组的顺序号  
     * @param memberIndex int 插入的顺序号  
     * @param member Component 成员组件  
     */   
    public void insertMember(int groupIndex, int memberIndex, Component member) {   
        getGroup(groupIndex).addMember(memberIndex, member);   
    }   
   
    /**  
     * 从组中移除成员组件  
     * @param groupIndex int  
     * @param memberIndex int  
     */   
    public void removeMember(int groupIndex, int memberIndex) {   
        getGroup(groupIndex).removeMember(memberIndex);   
    }   
   
    /**  
     * 取得成员组件  
     * @param groupIndex int 组的顺序号  
     * @param memberIndex int 成员组件的顺序号  
     * @return Component 成员组件  
     */   
    public Component getMember(int groupIndex, int memberIndex) {   
        return getGroup(groupIndex).getMember(memberIndex);   
    }   
   
    /**  
     * 取得全部成员组件  
     * @param groupIndex int 组的顺序号  
     * @return Component[] 全部成员组件  
     */   
    public Component[] getMembers(int groupIndex) {   
        return getGroup(groupIndex).getMembers();   
    }   
   
    /**  
     * 取得成员组件的总数  
     * @param groupIndex int 组的顺序号  
     * @return int 总数  
     */   
    public int getMemberCount(int groupIndex) {   
        return getGroup(groupIndex).getMemberCount();   
    }   
   
    /**  
     * 取得组  
     * @param index int 组的顺序号  
     * @return JGroupContainer 组  
     */   
    protected JGroupContainer getGroup(int index) {   
        return (JGroupContainer) groupList.get(index);   
    }   
   
    /**  
     * 覆写的addImpl方法,禁止再向JGroupPane中添加组件  
     * @param comp Component  
     * @param constraints Object  
     * @param index int  
     */   
    protected void addImpl(Component comp, Object constraints, int index) {   
        if (forbidFlag) {   
            if (! (comp instanceof JGroupContainer)) {   
                throw new UnsupportedOperationException(   
                    "JGroupPane can't add component!");   
            }   
        }   
        else {   
            super.addImpl(comp, constraints, index);   
        }   
    }   
   
    /**  
     * <P>Title: OpenSwing</P>  
     * <P>Description: 组面板布局管理器</P>  
     * <P>Copyright: Copyright (c) 2004</P>  
     * <P>Company: </P>  
     * @author <A href="mailto:sunkingxie@hotmail.com" mce_href="mailto:sunkingxie@hotmail.com">SunKing</A>  
     * @version 1.0  
     */   
    class GroupLayout   
        implements LayoutManager, java.io.Serializable {   
        int vgap = 0;   
        int hgap = 0;   
        public GroupLayout() {   
        }   
   
        public GroupLayout(int hg, int vg) {   
            this.hgap = hg;   
            this.vgap = vg;   
        }   
   
        public void addLayoutComponent(String name, Component comp) {   
        }   
   
        public void removeLayoutComponent(Component comp) {   
        }   
   
        public Dimension preferredLayoutSize(Container parent) {   
            synchronized (parent.getTreeLock()) {   
                Insets insets = parent.getInsets();   
                int ncomponents = parent.getComponentCount();   
                int w = 0;   
                int h = 0;   
                for (int i = 0; i < ncomponents; i++) {   
                    Component comp = parent.getComponent(i);   
                    Dimension d = comp.getPreferredSize();   
                    if (w < d.width) {   
                        w = d.width;   
                    }   
                    h += d.height + vgap;   
                }   
                return new Dimension(insets.left + insets.right + w + 2 * hgap,   
                                     insets.top + insets.bottom + h + 2 * vgap);   
            }   
        }   
   
        public Dimension minimumLayoutSize(Container parent) {   
            return preferredLayoutSize(parent);   
        }   
   
        public void layoutContainer(Container parent) {   
            synchronized (parent.getTreeLock()) {   
                Insets insets = parent.getInsets();   
                int ncomponents = parent.getComponentCount();   
                if (ncomponents == 0) {   
                    return;   
                }   
                int y = insets.top + vgap;   
                for (int c = 0; c < ncomponents; c++) {   
                    int h = parent.getComponent(c).getPreferredSize().height;   
                    parent.getComponent(c).setBounds(   
                        insets.left + hgap,   
                        y,   
                        parent.getWidth() - insets.left - insets.right -   
                        2 * hgap, h);   
                    y += h + vgap;   
                }   
            }   
        }   
   
        public String toString() {   
            return getClass().getName();   
        }   
    }   
   
    /**  
     * <P>Title: OpenSwing</P>  
     * <P>Description: 组</P>  
     * <P>Copyright: Copyright (c) 2004</P>  
     * <P>Company: </P>  
     * @author <A href="mailto:sunkingxie@hotmail.com" mce_href="mailto:sunkingxie@hotmail.com">SunKing</A>  
     * @version 1.0  
     */   
    class JGroupContainer   
        extends JPanel {   
        private JButton bttGroupTitle = new JButton();   
        private JPanel pMembers = new JPanel();   
        private JScrollPane sp;   
        public JGroupContainer() {   
            this("");   
        }   
   
        public JGroupContainer(String name) {   
            this(name, UIManager.getColor("Desktop.background"));   
        }   
   
        /**  
         * @param name String  组名  
         * @param background Color 成员组件所在面板背景色  
         */   
        public JGroupContainer(String name, Color background) {   
            bttGroupTitle.setText(name);   
            bttGroupTitle.setFocusable(false);   
            pMembers.setLayout(new GroupLayout(5, 5));   
            this.setLayout(new BorderLayout());   
            this.add(bttGroupTitle, BorderLayout.NORTH);   
   
            pMembers.setBackground(background);   
   
            Color thumbColor = UIManager.getColor("ScrollBar.thumb");   
            Color trackColor = UIManager.getColor("ScrollBar.track");   
            Color trackHighlightColor = UIManager.getColor(   
                "ScrollBar.trackHighlight");   
   
            UIManager.put("ScrollBar.thumb", background);   
            UIManager.put("ScrollBar.track", background);   
            UIManager.put("ScrollBar.trackHighlight", background);   
            sp = new JScrollPane(pMembers);   
            sp.setHorizontalScrollBarPolicy(   
                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);   
            this.add(sp, BorderLayout.CENTER);   
            collapse();   
            UIManager.put("ScrollBar.thumb", thumbColor);   
            UIManager.put("ScrollBar.track", trackColor);   
            UIManager.put("ScrollBar.trackHighlight", trackHighlightColor);   
   
        }   
   
        /**  
         * 设置间距  
         * @param hgap int 横间距  
         * @param vgap int 竖间距  
         */   
        public void setMemberGap(int hgap, int vgap) {   
            pMembers.setLayout(new GroupLayout(hgap, vgap));   
        }   
   
        /**  
         * 取得组的标题按钮  
         * @return JButton  
         */   
        public JButton getTitleButton() {   
            return bttGroupTitle;   
        }   
   
        /**  
         * 取得组的成员组件面板  
         * @return JPanel  
         */   
        public JPanel getMembersContainer() {   
            return pMembers;   
        }   
   
        /**  
         * 收缩组  
         */   
        public void collapse() {   
            sp.setVisible(false);   
            this.revalidate();   
        }   
   
        /**  
         * 展开组  
         */   
        public void expand() {   
            sp.setVisible(true);   
            this.revalidate();   
        }   
   
        /**  
         * 设置组名  
         * @param name String 组名  
         */   
        public void setName(String name) {   
            bttGroupTitle.setText(name);   
        }   
   
        /**  
         * 取得组名  
         * @return String  
         */   
        public String getName() {   
            return bttGroupTitle.getText();   
        }   
   
        /**  
         * 添加一个成员组件  
         * @param index int 顺序号  
         * @param c Component 成员组件  
         */   
        public void addMember(int index, Component c) {   
            pMembers.add(c, index);   
            pMembers.doLayout();   
        }   
   
        /**  
         * 删除一个成员组件  
         * @param index int 顺序号  
         */   
        public void removeMember(int index) {   
            pMembers.remove(index);   
            pMembers.doLayout();   
        }   
   
        /**  
         * 取得一个成员组件  
         * @param index int 顺序号  
         * @return Component 成员组件  
         */   
        public Component getMember(int index) {   
            return pMembers.getComponent(index);   
        }   
   
        /**  
         * 取得全部成员组件  
         * @return Component[] 成员组件  
         */   
        public Component[] getMembers() {   
            Component coms[] = new Component[getMemberCount()];   
            for (int i = 0; i < coms.length; i++) {   
                coms[i] = pMembers.getComponent(i);   
            }   
            return coms;   
        }   
   
        /**  
         * 取得成员组件总数  
         * @return int 总数  
         */   
        public int getMemberCount() {   
            return pMembers.getComponentCount();   
        }   
   
        /**  
         * 重写的toString方法  
         * @return String  
         */   
        public String toString() {   
            return getName();   
        }   
    }   
   
    /**  
         /**  
      * 测试程序  
      * @param args String[]  
      */   
     public static void main(String[] args) {   
//         try {    
//             UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());    
//         }    
//         catch (Exception e) {    
//         }    
         JFrame frame = new JFrame();   
//        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
         frame.setTitle("JGroupPanel Demo");   
         frame.getContentPane().setLayout(new BorderLayout());   
         JGroupPanel p = new JGroupPanel();   
         frame.getContentPane().add(p, BorderLayout.CENTER);   
   
         frame.setSize(150, 600);   
         Dimension d = Toolkit.getDefaultToolkit().getScreenSize();   
         frame.setLocation(d.width - frame.getSize().width - 10,   
                           10);   
         frame.setVisible(true);   
     }   
   
}

posted @ 2015-03-15 10:54  __夜风  阅读(405)  评论(0编辑  收藏  举报