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); } }

java模拟QQ的伸缩面板相关推荐

  1. java 模拟qq源码

    java 模拟qq源码: http://files.cnblogs.com/files/hujunzheng/QQ--hjzgg.zip 转载于:https://www.cnblogs.com/huj ...

  2. Java模拟QQ聊天

    模拟QQ,项目名叫:模拟 Wechat --模拟WeChat实现功能: 基础实现功能 ①  实现用户上网登录注册 ②  实现各个用户之间添加好友 ③  实现好友之间的聊天 ④  实现未读信息的提示 ⑤ ...

  3. java模拟老版QQ的伸缩面板

    package windows.best_demo; import java.awt.*; import javax.swing.*; import java.util.*; import java. ...

  4. java 模拟qq空间登陆_java最新完美实现模拟登录QQ登录QQ空间获取说说

    package com.pengliu.config; import com.pengliu.util.http.HttpService; /** * desc: 全局公共属性配置 */ public ...

  5. Java程序模拟QQ空间登录 - 并模拟刷说说的赞(图文) 注意:腾讯修改了加密算法,已失效(2015-01-31)

    Java程序模拟QQ空间登录 - 并模拟刷说说的赞 背景:在2013-10-25的一天,有个friend在QQ问我:"post登陆QQ空间抓取不到post的数据".于是故事就开始了 ...

  6. 【大话QT之八】模拟QQ系统设置面板实现功能

    业务需求: 基于网盘客户端的实现,原有网盘的设置面板无论从界面显示还是从业务需求都不能满足我们的正常需求.当前的要求是,模拟QQ系统设置的面板实现当前我们网盘中的基本配置功能.在完成这篇文章时已将基本 ...

  7. Java项目模拟QQ群聊和私聊(网络编程+多线程)

    [文末获取资源] 前几天学习了多线程,最近在学习网络编程,了解了UDP之后又学习了TCP,听一下大佬说,要看看你这两个东西掌握的怎么样,最好的办法就是写一个模拟QQ群聊和私聊,经过这几天的学习,以及不 ...

  8. java实现qq空间模块_Java实现模拟QQ空间图片上传

    Java实现模拟QQ空间图片上传 首先看效果: 首先编写我们的上传jsp代码,如下: pageEncoding="UTF-8"%> html PUBLIC "-// ...

  9. Java实现模拟QQ空间图片上传

    Java实现模拟QQ空间图片上传 首先看效果: 首先编写我们的上传jsp代码,如下: <%@ page language="java" contentType="t ...

最新文章

  1. 因果AI诊断模型登上nature:模拟专业医师思维,诊断罕见疾病,超越SOTA算法
  2. Unsupervised Feature Selection in Signed Social Networks 阅读笔记
  3. devc++64位不兼容_DNF玩家遭强制脱坑,只因64位更新后无法上游戏,如何解决?...
  4. python 预编译命令_Python子进程调用预编译j
  5. FFmpeg Maintainer赵军:FFmpeg关键组件与硬件加速
  6. java业务层怎么设计_java – 在业务逻辑和数据层看起来重叠时分解它们的最佳设计?...
  7. C# 跨平台的支付类库ICanPay
  8. uva11029 - Leading and Trailing
  9. TFS 表字典(部分)
  10. Could NOT find XXX (missing: XXX_LIBRARY XXX_DIR)
  11. 大数据成长之路:谈谈那些必须学习的Linux基础知识
  12. Python 进阶 —— defaultdict
  13. Android系统Google TTS 语音数据包安装步骤
  14. hdfs命令_HDFS命令
  15. 感性与容性负载的区别及无功功率补偿
  16. La3713 Astronauts 2-Sat
  17. 【mirror】国内镜像站,没事翻一翻
  18. 实验六——存储过程实验
  19. linux子进程崩溃父进程如何得知并重启子进程,子进程崩溃父进程如何得知并重启子进程...
  20. Cython 是什么?为什么会有 Cython?

热门文章

  1. 江西准金:茶颜悦色遭遇清冷客流骤降 今年已三次集中临时闭店
  2. c语言中bool库函数,C语言中的bool
  3. IC笔试:海思提前批数字芯片笔试
  4. java当前时间_java 获取当前时间的三种方法
  5. Blender物体跟踪实战教程
  6. 震撼低音演绎 这款索爱桌面电脑音响就是不一样
  7. 360线上虚拟现实全景展厅技术的作用
  8. 决策树(一) 信息熵 基尼系数
  9. mysql如何查询是否大小写敏感_MySQL查询大小写是否敏感问题分析
  10. android:stretchColumns=”0″