/* * This class implements a scrollable Popup Menu * * Copyright balajihe from * http://www.beginner-java-tutorial.com/scrollable-jpopupmenu.html * */ package ext.scrollablepopupmenu; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.AbstractButton; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JSeparator; import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicSeparatorUI; /** * This class implements a scrollable Popup Menu. * * @author balajihe from * http://www.beginner-java-tutorial.com/scrollable-jpopupmenu.html */ public class XJPopupMenu extends JPopupMenu implements ActionListener { /** Generated serialVersionUID. */ private static final long serialVersionUID = 1; private final JPanel panelMenus = new JPanel(); private JScrollPane scroll = null; private JFrame jframe = null; /** The Constant EMPTY_IMAGE_ICON. */ public static final Icon EMPTY_IMAGE_ICON = new ImageIcon("menu_spacer.gif"); /** * Instantiates a new xJ popup menu. * * @param jframe */ public XJPopupMenu(JFrame jframe) { super(); this.jframe = jframe; this.setLayout(new BorderLayout()); panelMenus.setLayout(new GridLayout(0, 1)); panelMenus.setBackground(UIManager.getColor("MenuItem.background")); // panelMenus.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5)); init(); } /** * Inits the. * */ public void init() { super.removeAll(); scroll = new JScrollPane(); scroll.setViewportView(panelMenus); scroll.setBorder(null); scroll.setMinimumSize(new Dimension(240, 40)); scroll.setMaximumSize(new Dimension(scroll.getMaximumSize().width, this.getToolkit() .getScreenSize().height - this.getToolkit().getScreenInsets(jframe.getGraphicsConfiguration()).top - this.getToolkit().getScreenInsets(jframe.getGraphicsConfiguration()).bottom - 4)); super.add(scroll, BorderLayout.CENTER); } /* (non-Javadoc) * @see javax.swing.JPopupMenu#show(java.awt.Component, int, int) */ @Override public void show(Component invoker, int x, int y) { init(); panelMenus.validate(); int maxsize = scroll.getMaximumSize().height; int realsize = panelMenus.getPreferredSize().height; int sizescroll = 0; if (maxsize < realsize) { sizescroll = scroll.getVerticalScrollBar().getPreferredSize().width; } scroll.setPreferredSize(new Dimension(scroll.getPreferredSize().width + sizescroll + 20, scroll .getPreferredSize().height)); this.pack(); this.setInvoker(invoker); if (sizescroll != 0) { // Set popup size only if scrollbar is visible this.setPopupSize(new Dimension(scroll.getPreferredSize().width + 20, scroll.getMaximumSize().height - 20)); } // this.setMaximumSize(scroll.getMaximumSize()); Point invokerOrigin = invoker.getLocationOnScreen(); this.setLocation((int) invokerOrigin.getX() + x, (int) invokerOrigin.getY() + y); this.setVisible(true); } /** * Hidemenu. * */ public void hidemenu() { if (this.isVisible()) { this.setVisible(false); } } /** * Adds the. * * * @param menuItem */ public void add(AbstractButton menuItem) { // menuItem.setMargin(new Insets(0, 20, 0 , 0)); if (menuItem == null) { return; } panelMenus.add(menuItem); menuItem.removeActionListener(this); menuItem.addActionListener(this); if (menuItem.getIcon() == null) { menuItem.setIcon(EMPTY_IMAGE_ICON); } } /* (non-Javadoc) * @see javax.swing.JPopupMenu#addSeparator() */ @Override public void addSeparator() { panelMenus.add(new XSeperator()); } /* (non-Javadoc) * @see java.awt.Container#removeAll() */ @Override public void removeAll() { panelMenus.removeAll(); } /* (non-Javadoc) * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ @Override public void actionPerformed(ActionEvent e) { this.hidemenu(); } /* (non-Javadoc) * @see java.awt.Container#getComponents() */ @Override public Component[] getComponents() { return panelMenus.getComponents(); } /** * . */ private static class XSeperator extends JSeparator { /** Generated serialVersionUID. */ private static final long serialVersionUID = -6249719411021239596L; /** * Instantiates a new x seperator. */ XSeperator() { ComponentUI ui = XBasicSeparatorUI.createUI(this); XSeperator.this.setUI(ui); } /** * . */ private static class XBasicSeparatorUI extends BasicSeparatorUI { /** * Creates the ui. * * * @param c * * @return the component ui */ public static ComponentUI createUI(JComponent c) { return new XBasicSeparatorUI(); } /* (non-Javadoc) * @see javax.swing.plaf.basic.BasicSeparatorUI#paint(java.awt.Graphics, javax.swing.JComponent) */ @Override public void paint(Graphics g, JComponent c) { Dimension s = c.getSize(); if (((JSeparator) c).getOrientation() == SwingConstants.VERTICAL) { g.setColor(c.getForeground()); g.drawLine(0, 0, 0, s.height); g.setColor(c.getBackground()); g.drawLine(1, 0, 1, s.height); } else // HORIZONTAL { g.setColor(c.getForeground()); g.drawLine(0, 7, s.width, 7); g.setColor(c.getBackground()); g.drawLine(0, 8, s.width, 8); } } } } }