在上面文章中实现了JPopupMenuButton
现在实现如下功能(改进)
思路
1 每次点击菜单的时候保存这个菜单的index,并且出发菜单下表变更事件
2 在JPopupButton中 监听事件, 并调用attachActionOnPopupMenu 绑定点击按钮所执行的菜单
实现:
JPopupMenu 达不到要求, 需要改造一下
package info.mikewang.part.test; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ContainerEvent; import java.awt.event.ContainerListener; import java.util.Vector; import javax.swing.AbstractButton; import javax.swing.JPopupMenu; import javax.swing.MenuElement; class JPopupButtonMenu extends JPopupMenu { private static final long serialVersionUID = -8812143869773395718L; private int clickedMenuIndex = -1; public JPopupButtonMenu() { this(null); } public JPopupButtonMenu(String label) { super(label); addContainerListener(new XContainerListener()); } public int getClickedMenuIndex() { return clickedMenuIndex; } public AbstractButton[] getSubClickedElements() { AbstractButton result[]; Vector<AbstractButton> tmpx = new Vector<AbstractButton>(); MenuElement tmp[] = getSubElements(); for (MenuElement menuElement : tmp) { if (menuElement instanceof AbstractButton) { tmpx.add((AbstractButton) menuElement); } } result = new AbstractButton[tmpx.size()]; for (int i = 0; i < tmpx.size(); i++) { result[i] = tmpx.elementAt(i); } return result; } // ---------------------------------- class XContainerListener implements ContainerListener { @Override public void componentAdded(ContainerEvent e) { Component c = e.getChild(); if (c instanceof AbstractButton) { ((AbstractButton) c).addActionListener(new XActionListener()); } } @Override public void componentRemoved(ContainerEvent e) { } } class XActionListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { AbstractButton ab = (AbstractButton) e.getSource(); AbstractButton abs[] = getSubClickedElements(); for (int i = 0; i < abs.length; i++) { if (ab == abs[i]) { int oldClickedMenuIndex = clickedMenuIndex; clickedMenuIndex = i; firePropertyChange("clickedMenuIndex", oldClickedMenuIndex, i); break; } } } } }
JPopupButton 本部分都差不多, 就增加了一个属性监听器, 监听clickedMenuIndex, 并调用attachActionOnPopupMenu, 改变下标
private void initClickRemember() { menu.addPropertyChangeListener("clickedMenuIndex", new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { Integer ii = (Integer) evt.getNewValue(); attachActionOnPopupMenu(ii.intValue()); } }); }