类似QQ/Outlook的菜单

昨天写了一遍, 结果提交的时候出错....
所以今天不高兴再写了, 直接上代码.
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一下
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CRichEditCtrl是一个强大的编辑控件,类似QQ中的文本输入框。它提供了许多丰富的功能和属性,使用户可以在文本框中进行各种编辑操作。 首先,CRichEditCtrl支持格式化文本的输入和显示。用户可以在文本框中输入普通文本、图像、表格等多种内容,并且可以对这些内容进行格式化,如设置字体、字号、颜色、对齐方式等,使文本呈现出更加丰富多样的样式。 其次,CRichEditCtrl还支持富文本编辑。用户可以在文本框中进行插入和删除操作,如插入链接、插入图片、插入超链接等。同时,用户还可以对文本进行复制、粘贴和剪切等操作,实现对文本内容的高效编辑和管理。 此外,CRichEditCtrl还提供了撤销和重做功能,使用户可以方便地撤销之前的编辑操作,并重新执行已经撤销的操作。这样,用户就可以随时回退到之前的状态,确保编辑操作的准确性和完整性。 最后,CRichEditCtrl还支持自动完成和输入提示功能。用户在输入文本时,CRichEditCtrl可以自动提供半透明的输入提示窗口,显示可能的补充内容,如常用词汇、表情符号等,帮助用户快速输入并提高输入效率。 综上所述,CRichEditCtrl类似QQ中的编辑控件,它具有强大的编辑功能、支持富文本编辑和格式化显示、提供撤销和重做功能,同时还支持自动完成和输入提示。这使得用户可以在文本输入时体验到更多的便捷和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值