`
hepeng_8
  • 浏览: 80244 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

QQ伸缩面板Java实现

 
阅读更多
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);     
     }     
     
}  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics