您的位置:首页 > 其它

类似QQ/Outlook的菜单

2007-10-07 09:38 363 查看
昨天写了一遍, 结果提交的时候出错....
所以今天不高兴再写了, 直接上代码.
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(0, 0, 0, 0));




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, 1, 1, 1.0, 1.0,


GridBagConstraints.NORTH, GridBagConstraints.NONE,


new Insets(1, 1, 1, 1), 0, 0));




} else ...{


maxGbc.weighty = 1.0d;


layout.setConstraints(maxComp, maxGbc);


panel.add(btn, new GridBagConstraints(0, index, 1, 1, 1.0, 0.0,


GridBagConstraints.NORTH, GridBagConstraints.NONE,


new Insets(1, 1, 1, 1), 0, 0));


}




} 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, 1, 1, 1.0, 1.0,


GridBagConstraints.NORTH, GridBagConstraints.NONE,


new Insets(1, 1, 1, 1), 0, 0));


}


}






/** *//**


* 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(


2, 2, 2, 2);






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(), 1, 1, 1.0, 0.0,


GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,


new Insets(0, 0, 0, 0), 0, 0);


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(400, 300);


frame.setVisible(true);


}


}



换了新公司, 网速象乌龟, 顺便BS一下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: