用JAVA SWING实现简单的折叠组件伸缩功能(不使用JLayeredPane)
实现界面折叠伸缩功能。代码如下:
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)相关推荐
- JAVA swing实现简单的学生管理系统
JAVA swing实现简单的学生管理系统 基本功能介绍 本系统实现了一个简单而实用的学生管理系统,通过这个学生管理系统我们可以进行一些基本的学生管理操作,它可以进行简单的添加学生.删除学生.修改学生 ...
- java 复选框怎么用_Java Swing公开课|Java Swing的复选框组件怎么用,看完这篇文章你一定就会了...
[摘要]作为一门面向对象编程语言,Java吸收了C++语言的优点,也展现了其强大的一面,我们能在各个地方看到其功能强大和简单易用的两个特征,当然,也吸引了很多程序员的注意力,所以就有人想了解Java的 ...
- Java Swing的简单学习
计算机软件实习记录(第一周)--Java Swing的简单学习 Swing的认识 1)Swing是一个用于开发Java应用程序用户界面的开发工具包(GUI工具包),是JAVA基础类的一部分. 2)它包 ...
- java swing实现简单的计算器源代码程序
原文:java swing实现简单的计算器源代码程序 源代码下载地址:http://www.zuidaima.com/share/1792762695060480.htm 陌落馨 2014-04-23 ...
- Java swing实现简单的浏览器源码免费分享
此篇给大家分享一下Java swing写的一款简单的浏览器源码,实现了基本的浏览器功能,但是对最新的前端样式和js兼容比较差,用的内核是IE的比较老的,此外引入了eclipse的三个jar包,因为e ...
- java免费浏览器,Java swing实现简单的浏览器源码免费分享
<p> <span style="color:#666666;font-family:"font-size:16px;background-color:#FFFF ...
- JAVA swing实现简单增删改查
前言 欢迎大家来到我的博客,请各位看客们点赞.收藏.关注三连! 欢迎大家关注我的知识库,Java之从零开始 · 语雀 你的关注就是我前进的动力! CSDN专注于问题解决的博客记录,语雀专注于知识的收集 ...
- java 雷霆战机 教程,java swing实现简单的雷霆战机小游戏项目源码附带视频指导修改教程...
<p> <span style="font-family:微软雅黑;font-size:19px;color:#666666;background-color:#FFFFF ...
- JAVA Swing实现简单的体重指数(BMI)计算器
BMI,Body Mass Index,身体质量指数,是用体重公斤数 除以 身高米数平方得出的,是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准. 而本文通过运用Java Swing实现了一个 ...
- 使用Java Swing实现简单计算器
import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.Vector; public cl ...
最新文章
- C语言编写的PHP框架--yaf入门编程
- 第二次作业--线性表
- android:theme.holo.light.,Android: Theme.Holo.Light.NoActionBar vs Theme.Light.NoTitleBar
- JAVA 对象引用,以及对象赋值
- hsv 明度的范围_通过HSV转换的方式实现图片数据增强
- 移动端禁止视频自动全屏播放
- linux支持异步io吗,Linux 异步IO
- 【kafka】Timeout of 60000ms expired before the position for partition could be determined
- 身为华人,我再一次不淡定了,中文输入项目启动
- toString方法和valueOf方法以及Symbol.toPrimitive方法的学习
- python转换js_将节点js转换为python-seri
- SQL进阶篇之约束(Constraints)
- 高级Magento模型 EAV
- 28岁的我坐在医院的轮椅上大哭
- oracle10g驱动怎么安装,oracle10g安装后怎么使用
- 网站实现发送帖子的功能
- 淘宝/天猫官方商品/订单订单API接口
- (一)双S型速度规划 原理
- Arduino最便宜的模拟量采集
- C++计算圆的面积和周长
热门文章
- Windows API 教程(七) hook 钩子监听
- sql left()函数
- Oracle怎样创建共享文件夹,OracleVirtualBox虚拟机如何实现文件夹共享
- IT战略规划之流程再造
- 网页中插入Flash动画(.swf)代码和常用参数设置
- FILecoin 将重大战略升级,FIL 或将引导商业数据
- saas商业模式和架构设计
- 《虎胆龙威4》观后感
- opqcp c语言代码混淆器 error
- 永恒之塔总是服务器未响应,《剑网3》《永恒之塔》怀旧服刚开上演“冲级热”,八月怀旧游戏集体搞事...