实现界面折叠伸缩功能。代码如下:

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** 不使用JLayeredPane组件实现折叠功能。**/
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 GroupColor 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]);//隐藏和显示的5个按钮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(bg[i - 1]);}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();//使此容器布置其组件。 大多数程序不应该直接调用此方法,而应调用validate方法。pNorth.doLayout();pCenter.doLayout();pSouth.doLayout();doLayout();//        pNorth.validate();
//        pCenter.validate();
//        pSouth.validate();
//        validate();}/*** 收缩组** @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 组名*              <p>*              <p>*              /***              插入一个组* @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 GroupLayoutimplements 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 JGroupContainerextends JPanel {/*** 按钮*/private JButton bttGroupTitle = new JButton();//存放按钮Membersprivate 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);sp = new JScrollPane(pMembers);//设置不显示水平滚动条sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);this.add(sp, BorderLayout.CENTER);collapse();}/*** 设置间距 (设置隐藏的按钮各自的间距)** @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) {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.setBounds(300, 300, 500, 600);frame.setVisible(true);}}

效果图如下:

本文参考的是 JAVA--好友界面面板__夜风的博客-CSDN博客

用JAVA SWING实现简单的折叠组件伸缩功能(不使用JLayeredPane)相关推荐

  1. JAVA swing实现简单的学生管理系统

    JAVA swing实现简单的学生管理系统 基本功能介绍 本系统实现了一个简单而实用的学生管理系统,通过这个学生管理系统我们可以进行一些基本的学生管理操作,它可以进行简单的添加学生.删除学生.修改学生 ...

  2. java 复选框怎么用_Java Swing公开课|Java Swing的复选框组件怎么用,看完这篇文章你一定就会了...

    [摘要]作为一门面向对象编程语言,Java吸收了C++语言的优点,也展现了其强大的一面,我们能在各个地方看到其功能强大和简单易用的两个特征,当然,也吸引了很多程序员的注意力,所以就有人想了解Java的 ...

  3. Java Swing的简单学习

    计算机软件实习记录(第一周)--Java Swing的简单学习 Swing的认识 1)Swing是一个用于开发Java应用程序用户界面的开发工具包(GUI工具包),是JAVA基础类的一部分. 2)它包 ...

  4. java swing实现简单的计算器源代码程序

    原文:java swing实现简单的计算器源代码程序 源代码下载地址:http://www.zuidaima.com/share/1792762695060480.htm 陌落馨 2014-04-23 ...

  5. Java swing实现简单的浏览器源码免费分享

    ​此篇给大家分享一下Java swing写的一款简单的浏览器源码,实现了基本的浏览器功能,但是对最新的前端样式和js兼容比较差,用的内核是IE的比较老的,此外引入了eclipse的三个jar包,因为e ...

  6. java免费浏览器,Java swing实现简单的浏览器源码免费分享

    <p> <span style="color:#666666;font-family:"font-size:16px;background-color:#FFFF ...

  7. JAVA swing实现简单增删改查

    前言 欢迎大家来到我的博客,请各位看客们点赞.收藏.关注三连! 欢迎大家关注我的知识库,Java之从零开始 · 语雀 你的关注就是我前进的动力! CSDN专注于问题解决的博客记录,语雀专注于知识的收集 ...

  8. java 雷霆战机 教程,java swing实现简单的雷霆战机小游戏项目源码附带视频指导修改教程...

    <p> <span style="font-family:微软雅黑;font-size:19px;color:#666666;background-color:#FFFFF ...

  9. JAVA Swing实现简单的体重指数(BMI)计算器

    BMI,Body Mass Index,身体质量指数,是用体重公斤数 除以 身高米数平方得出的,是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准. 而本文通过运用Java Swing实现了一个 ...

  10. 使用Java Swing实现简单计算器

    import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.Vector; public cl ...

最新文章

  1. C语言编写的PHP框架--yaf入门编程
  2. 第二次作业--线性表
  3. android:theme.holo.light.,Android: Theme.Holo.Light.NoActionBar vs Theme.Light.NoTitleBar
  4. JAVA 对象引用,以及对象赋值
  5. hsv 明度的范围_通过HSV转换的方式实现图片数据增强
  6. 移动端禁止视频自动全屏播放
  7. linux支持异步io吗,Linux 异步IO
  8. 【kafka】Timeout of 60000ms expired before the position for partition could be determined
  9. 身为华人,我再一次不淡定了,中文输入项目启动
  10. toString方法和valueOf方法以及Symbol.toPrimitive方法的学习
  11. python转换js_将节点js转换为python-seri
  12. SQL进阶篇之约束(Constraints)
  13. 高级Magento模型 EAV
  14. 28岁的我坐在医院的轮椅上大哭
  15. oracle10g驱动怎么安装,oracle10g安装后怎么使用
  16. 网站实现发送帖子的功能
  17. 淘宝/天猫官方商品/订单订单API接口
  18. (一)双S型速度规划 原理
  19. Arduino最便宜的模拟量采集
  20. C++计算圆的面积和周长

热门文章

  1. Windows API 教程(七) hook 钩子监听
  2. sql left()函数
  3. Oracle怎样创建共享文件夹,OracleVirtualBox虚拟机如何实现文件夹共享
  4. IT战略规划之流程再造
  5. 网页中插入Flash动画(.swf)代码和常用参数设置
  6. FILecoin 将重大战略升级,FIL 或将引导商业数据
  7. saas商业模式和架构设计
  8. 《虎胆龙威4》观后感
  9. opqcp c语言代码混淆器 error
  10. 永恒之塔总是服务器未响应,《剑网3》《永恒之塔》怀旧服刚开上演“冲级热”,八月怀旧游戏集体搞事...