类似QQ/Outlook的菜单

原创 2007年10月07日 09:38:00
昨天写了一遍, 结果提交的时候出错....
所以今天不高兴再写了, 直接上代码.
5个类. 其中3个组件, 1个Layout, 1个测试类.
/**
 * Come from Brad.Wu.
 
*/

package org.brad.menu.pane;

import java.awt.LayoutManager;
import java.util.HashMap;
import java.util.Set;

import javax.swing.JPanel;

/**
 * Create at Oct 5, 2007 4:49:40 PM<br>
 * 
 * 
@author brad.wu
 * 
@version 0.1
 
*/

public class MenuPane extends JPanel {
    
private static final long serialVersionUID = 6309159344110765687L;

    
private HashMap<Menu, Boolean> map = new HashMap<Menu, Boolean>();

    
public MenuPane() {
        
super(new MenuPaneLayout());
    }


    
/**
     * Create at Oct 5, 2007 4:50:15 PM<br>
     * (non-Javadoc)
     * 
     * 
@see java.awt.Container#setLayout(java.awt.LayoutManager)
     * 
@deprecated layout is fixed. Don't use this method anyway.
     
*/

    @Override
    
public void setLayout(LayoutManager mgr) {
        
super.setLayout(mgr);
    }


    
/**
     * Create at Oct 5, 2007 4:52:51 PM<br>
     * 
     * 
@param menu
     
*/

    
public void expand(Menu menu) {
        Set
<Menu> menus = map.keySet();
        
for (Menu child : menus) {
            map.put(child, 
false);
        }

        map.put(menu, 
true);
        
// repaint
        validate();
    }


    
/**
     * Create at Oct 5, 2007 4:54:46 PM<br>
     * 
     * 
@param menu
     * 
@return
     
*/

    
public boolean isExpanded(Menu menu) {
        
if (!map.containsKey(menu)) {
            
return false;
        }

        
return map.get(menu);
    }

}

 
/**
 * Come from Brad.Wu.
 
*/

package org.brad.menu.pane;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;

/**
 * Create at Oct 5, 2007 4:18:17 PM<br>
 * 
 * 
@author brad.wu
 * 
@version 0.1
 
*/

public class Menu extends JPanel implements ActionListener {
    
private static final long serialVersionUID = -8449353696728405923L;

    
/** menu button */
    
private JButton button = new JButton();

    
/** buttons container */
    
private JPanel panel = new JPanel();

    
/** scroll of buttons container */
    
private JScrollPane scroll = new JScrollPane(panel);

    
public Menu() {
        
this("");
    }


    
public Menu(String text) {
        button.setHorizontalAlignment(JLabel.CENTER);
        button.setText(text);
        button.setContentAreaFilled(
false);
        button.setFocusable(
false);
        button.addActionListener(
this);
        setLayout(
new BorderLayout());
        add(button, BorderLayout.NORTH);
        add(scroll, BorderLayout.CENTER);
        scroll.setBorder(
new EmptyBorder(0000));

        panel.setLayout(
new GridBagLayout());
    }


    
/**
     * Create at Oct 5, 2007 4:19:51 PM<br>
     * (non-Javadoc)
     * 
     * 
@see java.awt.Container#setLayout(java.awt.LayoutManager)
     * 
@deprecated layout is fixed. Don't use this method anyway.
     
*/

    @Override
    
public void setLayout(LayoutManager mgr) {
        
super.setLayout(mgr);
    }


    
/**
     * Create at Oct 5, 2007 4:22:56 PM<br>
     * 
     * 
@param text
     
*/

    
public void setText(String text) {
        button.setText(text);
    }


    
/**
     * Create at Oct 5, 2007 4:22:49 PM<br>
     * 
     * 
@return
     
*/

    
public String getText() {
        
return button.getText();
    }


    
/**
     * Create at Oct 5, 2007 4:23:24 PM<br>
     * (non-Javadoc)
     * 
     * 
@see javax.swing.JComponent#getMinimumSize()
     
*/

    @Override
    
public Dimension getMinimumSize() {
        
return button.getMinimumSize();
    }


    
/**
     * Create at Oct 5, 2007 5:14:12 PM<br>
     * (non-Javadoc)
     * 
     * 
@see javax.swing.JComponent#getPreferredSize()
     
*/

    @Override
    
public Dimension getPreferredSize() {
        
return button.getPreferredSize();
    }


    
/**
     * Create at Oct 5, 2007 5:23:54 PM<br>
     * (non-Javadoc)
     * 
     * 
@see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
     
*/

    
public void actionPerformed(ActionEvent e) {
        MenuPane parent 
= (MenuPane) this.getParent();
        
if (parent.isExpanded(this)) {
            
return;
        }
 else {
            parent.expand(
this);
        }

    }


    
/**
     * Create at Oct 5, 2007 5:27:33 PM<br>
     * 
     * 
@param btn
     
*/

    
public void addButton(JButton btn) {
        addButton(btn, 
-1);
    }


    
/**
     * Create at Oct 5, 2007 5:29:12 PM<br>
     * 
     * 
@param btn
     * 
@param index
     
*/

    
public void addButton(JButton btn, int index) {
        
int count = panel.getComponentCount();
        
if (index != -1{
            
int maxIndex = -1;
            Component maxComp 
= null;
            GridBagConstraints maxGbc 
= null;
            GridBagLayout layout 
= (GridBagLayout) panel.getLayout();
            
for (int i = 0; i < count; i++{
                Component comp 
= panel.getComponent(i);
                GridBagConstraints gbc 
= layout.getConstraints(comp);
                
if (gbc.gridy >= index) {
                    gbc.gridy 
+= 1;
                }

                layout.setConstraints(comp, gbc);
                
if (gbc.gridy > maxIndex) {
                    maxIndex 
= gbc.gridy;
                    maxComp 
= comp;
                    maxGbc 
= gbc;
                }

            }

            
if (maxIndex < index) {
                panel.add(btn, 
new GridBagConstraints(0, index, 111.01.0,
                        GridBagConstraints.NORTH, GridBagConstraints.NONE,
                        
new Insets(1111), 00));
            }
 else {
                maxGbc.weighty 
= 1.0d;
                layout.setConstraints(maxComp, maxGbc);
                panel.add(btn, 
new GridBagConstraints(0, index, 111.00.0,
                        GridBagConstraints.NORTH, GridBagConstraints.NONE,
                        
new Insets(1111), 00));
            }

        }
 else {
            GridBagLayout layout 
= (GridBagLayout) panel.getLayout();
            
for (int i = 0; i < count; i++{
                Component comp 
= panel.getComponent(i);
                GridBagConstraints gbc 
= layout.getConstraints(comp);
                
if (gbc.weighty == 1.0d{
                    gbc.weighty 
= 0.0d;
                    layout.setConstraints(comp, gbc);
                }

            }

            panel.add(btn, 
new GridBagConstraints(0, count, 111.01.0,
                    GridBagConstraints.NORTH, GridBagConstraints.NONE,
                    
new Insets(1111), 00));
        }

    }


    
/**
     * Create at Oct 5, 2007 5:29:55 PM<br>
     * 
     * 
@param button
     
*/

    
public void removeButton(JButton button) {
        GridBagLayout layout 
= (GridBagLayout) panel.getLayout();
        GridBagConstraints gbc 
= layout.getConstraints(button);
        
boolean last = gbc.weighty == 1.0d;
        
int maxIndex = -1;
        Component maxComp 
= null;
        GridBagConstraints maxGbc 
= null;
        
int index = gbc.gridy;
        
int count = panel.getComponentCount();
        
for (int i = 0; i < count; i++{
            Component comp 
= panel.getComponent(i);
            
if (comp == button)
                
continue;
            gbc 
= layout.getConstraints(comp);
            
if (gbc.gridy > index) {
                gbc.gridy 
-= 1;
            }

            
if (last && gbc.gridy > maxIndex) {
                maxIndex 
= gbc.gridy;
                maxComp 
= comp;
                maxGbc 
= gbc;
            }

            layout.setConstraints(comp, gbc);
        }

        
if (last) {
            maxGbc.weighty 
= 1.0d;
            layout.setConstraints(maxComp, maxGbc);
        }

        panel.remove(button);
    }


    
/**
     * Create at Oct 5, 2007 5:29:58 PM<br>
     * 
     * 
@param index
     
*/

    
public void removeButton(int index) {
        GridBagLayout layout 
= (GridBagLayout) panel.getLayout();
        
int count = panel.getComponentCount();
        
for (int i = 0; i < count; i++{
            GridBagConstraints gbc 
= layout.getConstraints(panel
                    .getComponent(i));
            
if (gbc.gridy == index) {
                removeButton((JButton) panel.getComponent(i));
                
break;
            }

        }

    }

}

/**
 * Come from Brad.Wu.
 
*/

package org.brad.menu.pane;

import java.awt.event.MouseEvent;

import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.border.Border;

/**
 * Create at Oct 5, 2007 5:35:54 PM<br>
 * 
 * 
@author brad.wu
 * 
@version 0.1
 
*/

public class MenuButton extends JButton {
    
private static final long serialVersionUID = -3625340627252182101L;

    
private static final Border ROLLOVER_BORDER = BorderFactory.createEtchedBorder();

    
private static final Border EMPTY_BORDER = BorderFactory.createEmptyBorder(
            
2222);

    
public MenuButton() {
        
this(""null);
    }


    
public MenuButton(Icon icon) {
        
this("", icon);
    }


    
public MenuButton(String text, Icon icon) {
        
super(text, icon);
        
this.setContentAreaFilled(false);
        setBorder(EMPTY_BORDER);
        setFocusable(
false);
    }


    
public MenuButton(String text) {
        
this(text, null);
    }


    
/**
     * Create at Oct 5, 2007 5:36:42 PM<br>
     * (non-Javadoc)
     * 
     * 
@see javax.swing.JComponent#processMouseEvent(java.awt.event.MouseEvent)
     
*/

    @Override
    
protected void processMouseEvent(MouseEvent e) {
        
if (e.getID() == MouseEvent.MOUSE_ENTERED) {
            setBorder(ROLLOVER_BORDER);
        }
 else if (e.getID() == MouseEvent.MOUSE_EXITED) {
            setBorder(EMPTY_BORDER);
        }

        
super.processMouseEvent(e);
    }

}

/**
 * Come from Brad.Wu.
 
*/

package org.brad.menu.pane;

import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

/**
 * Create at Oct 5, 2007 4:14:20 PM<br>
 * Layout of MenuPane.
 * 
 * 
@author brad.wu
 * 
@version 0.1
 
*/

public class MenuPaneLayout extends GridBagLayout {
    
private static final long serialVersionUID = -1732668875718395337L;

    
/**
     * Create at Oct 5, 2007 4:46:43 PM<br>
     * (non-Javadoc)
     * 
     * 
@see java.awt.GridBagLayout#addLayoutComponent(java.awt.Component,
     *      java.lang.Object)
     
*/

    @Override
    
public void addLayoutComponent(Component comp, Object constraints) {
        
if (constraints instanceof Integer) {
            GridBagConstraints gbc 
= new GridBagConstraints(0,
                    ((Integer) constraints).intValue(), 
111.00.0,
                    GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
                    
new Insets(0000), 00);
            
super.addLayoutComponent(comp, gbc);
        }
 else {
            
super.addLayoutComponent(comp, constraints);
        }

    }


    
/**
     * Create at Oct 5, 2007 5:02:38 PM<br>
     * (non-Javadoc)
     * 
     * 
@see java.awt.GridBagLayout#getConstraints(java.awt.Component)
     
*/

    @Override
    
public GridBagConstraints getConstraints(Component comp) {
        GridBagConstraints gbc 
= super.getConstraints(comp);
        MenuPane parent 
= (MenuPane) comp.getParent();
        
if (parent.isExpanded((Menu) comp)) {
            gbc.fill 
= GridBagConstraints.BOTH;
        }
 else {
            gbc.fill 
= GridBagConstraints.HORIZONTAL;
        }

        
return gbc;
    }


    
/**
     * Create at Oct 5, 2007 5:11:20 PM<br>
     * (non-Javadoc)
     * 
@see java.awt.GridBagLayout#lookupConstraints(java.awt.Component)
     
*/

    @Override
    
protected GridBagConstraints lookupConstraints(Component comp) {
        GridBagConstraints gbc 
= super.lookupConstraints(comp);
        MenuPane parent 
= (MenuPane) comp.getParent();
        
if (parent.isExpanded((Menu) comp)) {
            gbc.fill 
= GridBagConstraints.BOTH;
            gbc.weighty 
= 1.0d;
        }
 else {
            gbc.fill 
= GridBagConstraints.HORIZONTAL;
            gbc.weighty 
= 0.0d;
        }

        
return gbc;
    }

}

/**
 * Come from Brad.Wu.
 
*/

package org.brad.menu.pane;

import javax.swing.JFrame;

/**
 * Create at Oct 5, 2007 5:04:28 PM<br>
 * 
 * 
@author brad.wu
 * 
@version 0.1
 
*/

public class MenuPaneTest {
    
/**
     * Create at Oct 5, 2007 5:04:28 PM<br>
     * 
     * 
@param args
     
*/

    
public static void main(String[] args) {
        Menu menu1 
= new Menu("First");
        MenuButton b1 
= new MenuButton("");
        menu1.addButton(b1);
        MenuButton b2 
= new MenuButton("");
        menu1.addButton(b2);
        MenuButton b3 
= new MenuButton("");
        menu1.addButton(b3);
        MenuButton b4 
= new MenuButton("");
        menu1.addButton(b4, 
1);
        menu1.removeButton(
3);
        Menu menu2 
= new Menu("Second");
        Menu menu3 
= new Menu("Third");
        MenuPane panel 
= new MenuPane();
        panel.add(menu1, 
new Integer(0));
        panel.add(menu2, 
new Integer(1));
        panel.add(menu3, 
new Integer(2));
        panel.expand(menu2);
        
        JFrame frame 
= new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(panel);
        frame.setSize(
400300);
        frame.setVisible(
true);
    }

}

换了新公司, 网速象乌龟, 顺便BS一下

相关文章推荐

android开发之&使用ViewPager加gridView实现菜单按钮分页滑动(类似QQ表情选择翻页效果)

刚做的项目中要用到菜单分页,以前没做过,仔细想了想,既然是分页,肯定就少不了ViewPager,大家都知道gridView可以实现九宫格,刚好满足我们的需求,我做的是gridview单行显示,大家如果...

outlook(类QQ菜单) pb

  • 2010年06月25日 00:13
  • 49KB
  • 下载

类似QQ的伸缩菜单

  • 2008年04月03日 23:23
  • 9KB
  • 下载

Android类似qq消息滑动菜单

先上效果图: 本工程需要lib库支持,该库摘自与网上资源,因忘记原始出处链接,未能在此提供给大家参考。 该lib库我已上传到资源中,供大家学习交流:http://download.csdn.net...

unityios开发--NGUI类似QQ菜单实现

NGUI很容易就可以实现点击一个按钮填出全部在点击一下隐藏的效果,在NGUI自带的事例中也有类似的效果,今天简单说一下用到的那几个脚本,效果点击箭头之后就出现这个效果。 第一步创建一个 创建Men...

类似qq消息滑动菜单Lib库

  • 2016年02月03日 15:40
  • 647KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:类似QQ/Outlook的菜单
举报原因:
原因补充:

(最多只允许输入30个字)