QQ伸缩面板Java实现
2011-11-08 23:38
381 查看
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); } }
相关文章推荐
- QQ伸缩面板Java实现
- java模拟老版QQ的伸缩面板
- Java模拟QQ桌面截图功能实现方法
- Java学习笔记之 swing 基本实现QQ截屏功能
- QQ侧滑面板特效的实现
- 用Java实现类似QQ弹出的ToolTip框的功能
- QT版:QQ面板抽屉效果实现
- 让input支持 ctrl v上传粘贴图片? 让input支持QQ截图或剪切板中的图像数据(Java实现保存)
- java学习笔记-----qq项目----在服务器端实现两个客户端的通信的原理
- Java实现画图面板
- 实现了界面可以像QQ一样像上伸缩
- 初学java之模拟QQ聊天软件(简单实现)
- C#中实现窗体第二次打开时,在原来第一次关闭的位置,类似于QQ面板
- js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
- QQ 登陆的 Scribe-Java 实现
- qt实现类似QQ伸缩窗口--鼠标事件应用
- java学习笔记—使用HttpSession实现QQ的访问记录(31)
- Java 基于JavaMail实现QQ邮件发送(也可实现群发)
- java使用JMail通过QQ邮件服务器实现自动发送邮件
- Java之Socket简单聊天实现(QQ续二)