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实现 模仿QQ的五子棋 QQ五子棋的java实现 模仿QQ的五子棋 QQ五子棋的java实现 模仿QQ的五子棋
如何利用 Java 实现 QQ 文件传输功能 现在, 通过网络传输文件已经非常普遍, 各种传输工 具也很多, 最具有代表性的就是 QQ 提供的文件传输功能了, 它能让好友之间方便的把自己的文件传给对方。 仔细查看 QQ 的...
自动分页的面板制作QQ面板javaSwing
QQ源码Java实现,代码完整可以运行,代码的分析详见我的博客文章 Java实现QQ,网址http://blog.csdn.net/codehxy/article/details/25309991
可以类似于微软Outlook界面的可伸缩控件,开源的OutLookBar控件、也类似于qq面板的效果
Java 实现 QQ 功能 Java 实现 QQ 功能 Java 实现 QQ 功能 内附程序使用说明
Java实现QQ屏幕截图功能.zip Java实现QQ屏幕截图功能.zip Java实现QQ屏幕截图功能.zip
用JAVA实现的简单QQ程序 采用TCP连接技术 可实现简单通信与文件传输
java 实现的qq登陆界面,适合初学java awt和swing的同学学习
Java实现的企业内部QQ聊天系统,Socket线程通信,单人,多人在线聊天
Java实现仿QQ登陆模式
QQ面板实现 JS
使用java实现QQ聊天功能
java qq 聊天 源码
Java实现QQ屏幕截图源码
使用java编写实现的仿qq功能,能够很大程度上与现在的qq版本内容相似,能够很好的实现聊天和添加好友注册等功能,内含数据库的代码,希望小伙伴们可以多多支持。
java实现QQ登录页面,对按键进行监控6
Java 实现QQ聊天功能,模拟QQ软件 能聊天 !
这是一个用Java实现的QQ聊天程序 import java.net.*; import jicq.message.*; import java.sql.*; import java.util.*; import jicq.friend.*; import jicq.session.*; import oracle.jdbc.driver.*;