下面列出了怎么用javax.swing.event.PopupMenuListener的API类实例代码及写法,或者点击链接到github查看源代码。
protected PopupMenuListener getMenuListener() {
if (menuListener == null) {
menuListener = new PopupMenuAdapter() {
@Override
public void popupMenuWillBecomeInvisible(final PopupMenuEvent e) {
onHide();
}
@Override
public void popupMenuCanceled(final PopupMenuEvent e) {
onHide();
}
private void onHide() {
if (popupMenu == null) return;
popupMenu.removePopupMenuListener(this);
popupMenu.removeMenuKeyListener(menuKeyListener);
}
};
}
return menuListener;
}
private void setupAction() {
addActionListener(e -> {
JPopupMenu popupMenu = menuProvider.getPopupMenu();
if (!popupMenu.isVisible()) {
// hack to prevent filter popup from opening itself again
// when you click the button to actually close it while it
// is open
if (System.currentTimeMillis() - lastPopupCloseTime < POPUP_CLOSE_DELTA) {
return;
}
popupMenu.addPopupMenuListener(popupListener);
for (PopupMenuListener listener : otherListeners) {
popupMenu.addPopupMenuListener(listener);
}
popupMenu.show(DropDownPopupButton.this, 0, DropDownPopupButton.this.getHeight() - 1);
popupMenu.requestFocusInWindow();
}
});
}
@Nonnull
public static MouseListener installPopupHandler(@Nonnull JComponent component,
@Nonnull ActionGroup group,
@NonNls String place,
@Nonnull ActionManager actionManager,
@Nullable PopupMenuListener menuListener) {
if (ApplicationManager.getApplication() == null) return new MouseAdapter() {
};
PopupHandler popupHandler = new PopupHandler() {
@Override
public void invokePopup(Component comp, int x, int y) {
ActionPopupMenu popupMenu = actionManager.createActionPopupMenu(place, group);
popupMenu.setTargetComponent(component);
JPopupMenu menu = popupMenu.getComponent();
if (menuListener != null) menu.addPopupMenuListener(menuListener);
menu.show(comp, x, y);
}
};
component.addMouseListener(popupHandler);
return popupHandler;
}
public DarkScrollableTabSupport(final DarkTabbedPaneUI ui, final int tabPlacement) {
super(ui);
this.ui = ui;
viewport = new DarkScrollableTabViewport(ui);
tabPanel = new DarkScrollableTabPanel(ui);
viewport.setView(tabPanel);
viewport.addMouseWheelListener(this);
moreTabsButton = ui.createMoreTabsButton();
moreTabsButton.setVisible(false);
moreTabsButton.addActionListener(this);
newTabButton = ui.createNewTabButton();
newTabButton.setVisible(PropertyUtil.getBooleanProperty(ui.tabPane, DarkTabbedPaneUI.KEY_SHOW_NEW_TAB_BUTTON));
scrollPopupMenu = new ScrollPopupMenu(UIManager.getInt(DarkTabbedPaneUI.KEY_MAX_POPUP_HEIGHT));
PopupMenuListener popupMenuListener = new PopupMenuAdapter() {
@Override
public void popupMenuWillBecomeInvisible(final PopupMenuEvent e) {
lastClickEvent = System.currentTimeMillis();
}
};
scrollPopupMenu.addPopupMenuListener(popupMenuListener);
ui.tabPane.add(moreTabsButton);
timer = new Timer(SCROLL_REWIND_DELAY, e -> endScroll());
timer.setRepeats(false);
}
public void setPopupMenu(final JPopupMenu popupMenu) {
MenuKeyListener keyListener = getMenuKeyListener();
PopupMenuListener popupMenuListener = getMenuListener();
this.popupMenu = popupMenu;
if (popupMenu != null) {
popupMenu.removeMenuKeyListener(keyListener);
popupMenu.removePopupMenuListener(popupMenuListener);
popupMenu.addMenuKeyListener(keyListener);
popupMenu.addPopupMenuListener(popupMenuListener);
}
}
private JMenu addSubMenu(String id, JMenu parentMenu, PopupMenuListener popupListener) {
JMenu menu = new JMenu(StringResource.get(id));
menu.setName(id);
menu.setFont(FontResource.getNormalFont());
// menu.setForeground(ColorResource.getLightFontColor());
menu.addActionListener(this);
// menu.setBackground(ColorResource.getDarkerBgColor());
menu.setBorderPainted(false);
menu.getPopupMenu().addPopupMenuListener(popupListener);
parentMenu.add(menu);
return menu;
}
/**
* Maps {@code JPopupMenu.addPopupMenuListener(PopupMenuListener)}
* through queue
*/
public void addPopupMenuListener(final PopupMenuListener popupMenuListener) {
runMapping(new MapVoidAction("addPopupMenuListener") {
@Override
public void map() {
((JPopupMenu) getSource()).addPopupMenuListener(popupMenuListener);
}
});
}
/**
* Maps {@code JPopupMenu.removePopupMenuListener(PopupMenuListener)}
* through queue
*/
public void removePopupMenuListener(final PopupMenuListener popupMenuListener) {
runMapping(new MapVoidAction("removePopupMenuListener") {
@Override
public void map() {
((JPopupMenu) getSource()).removePopupMenuListener(popupMenuListener);
}
});
}
@Override
public void popupMenuWillBecomeInvisible(final PopupMenuEvent e) {
lastPopupCloseTime = System.currentTimeMillis();
JPopupMenu jPopupMenu = (JPopupMenu) e.getSource();
jPopupMenu.removePopupMenuListener(this);
for (PopupMenuListener otherListener : otherListeners) {
jPopupMenu.removePopupMenuListener(otherListener);
}
}
private MainPanel() {
super(new BorderLayout());
setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JComboBox<String> combo = new JComboBox<String>(makeModel()) {
private transient PopupMenuListener listener;
@Override public void updateUI() {
removePopupMenuListener(listener);
super.updateUI();
if (getUI() instanceof WindowsComboBoxUI) {
setUI(new RightPopupWindowsComboBoxUI());
} else {
setUI(new RightPopupBasicComboBoxUI());
}
listener = new RightPopupMenuListener();
addPopupMenuListener(listener);
}
};
JPanel p = new JPanel(new GridLayout(2, 2, 5, 5));
p.add(new JComboBox<>(makeModel()));
p.add(new JLabel("<- default"));
p.add(combo);
p.add(new JLabel("<- RightPopupMenuListener"));
add(p, BorderLayout.NORTH);
setPreferredSize(new Dimension(320, 240));
}
public PopupMenuListener getMenuHandler() {
return menuHandler;
}
public void removePopupMenuListener(PopupMenuListener l) {
combo.removePopupMenuListener(l);
}
public PopupMenuListener[] getPopupMenuListeners() {
return combo.getPopupMenuListeners();
}
public void addPopupMenuListener(PopupMenuListener l) {
combo.addPopupMenuListener(l);
}
public void removePopupMenuListener(PopupMenuListener l) {
combo.removePopupMenuListener(l);
}
public PopupMenuListener[] getPopupMenuListeners() {
return combo.getPopupMenuListeners();
}
public void addPopupMenuListener(PopupMenuListener l) {
combo.addPopupMenuListener(l);
}
private MainPanel() {
super(new BorderLayout());
String[] model = {"123456", "7890", "a"};
JComboBox<String> comboBox0 = new JComboBox<>(model);
comboBox0.setEditable(true);
JComboBox<String> comboBox1 = new JComboBox<String>(model) {
private transient PopupMenuListener handler;
@Override public void updateUI() {
removePopupMenuListener(handler);
super.updateUI();
setEditable(true);
handler = new SelectItemMenuListener();
addPopupMenuListener(handler);
}
};
JComboBox<String> comboBox2 = new JComboBox<String>(model) {
private static final int MAX_HISTORY = 10;
private static final String ENTER_PRESSED = "enterPressed";
private transient PopupMenuListener handler;
@Override public void updateUI() {
removePopupMenuListener(handler);
getActionMap().put(ENTER_PRESSED, null);
super.updateUI();
Action defaultAction = getActionMap().get(ENTER_PRESSED);
Action a = new AbstractAction() {
@Override public void actionPerformed(ActionEvent e) {
boolean isPopupVisible = isPopupVisible();
setPopupVisible(false);
DefaultComboBoxModel<String> m = (DefaultComboBoxModel<String>) getModel();
String str = Objects.toString(getEditor().getItem(), "");
if (m.getIndexOf(str) < 0) {
m.removeElement(str);
m.insertElementAt(str, 0);
if (m.getSize() > MAX_HISTORY) {
m.removeElementAt(MAX_HISTORY);
}
setSelectedIndex(0);
setPopupVisible(isPopupVisible);
} else {
defaultAction.actionPerformed(e);
}
}
};
getActionMap().put(ENTER_PRESSED, a);
setEditable(true);
handler = new SelectItemMenuListener();
addPopupMenuListener(handler);
}
};
JPanel p = new JPanel(new GridLayout(0, 1));
p.add(new JLabel("Default:", SwingConstants.LEFT));
p.add(comboBox0);
p.add(Box.createVerticalStrut(15));
p.add(new JLabel("popupMenuWillBecomeVisible:", SwingConstants.LEFT));
p.add(comboBox1);
p.add(Box.createVerticalStrut(15));
p.add(new JLabel("+enterPressed Action:", SwingConstants.LEFT));
p.add(comboBox2);
add(p, BorderLayout.NORTH);
setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
setPreferredSize(new Dimension(320, 240));
}
private MainPanel() {
super(new BorderLayout(15, 15));
UIManager.put("ScrollBar.width", 10);
UIManager.put("ScrollBar.thumbHeight", 20); // GTKLookAndFeel, SynthLookAndFeel, NimbusLookAndFeel
UIManager.put("ScrollBar.minimumThumbSize", new Dimension(30, 30));
UIManager.put("ScrollBar.incrementButtonGap", 0);
UIManager.put("ScrollBar.decrementButtonGap", 0);
UIManager.put("ScrollBar.thumb", THUMB);
UIManager.put("ScrollBar.track", BACKGROUND);
UIManager.put("ComboBox.foreground", FOREGROUND);
UIManager.put("ComboBox.background", BACKGROUND);
UIManager.put("ComboBox.selectionForeground", SELECTION_FOREGROUND);
UIManager.put("ComboBox.selectionBackground", BACKGROUND);
UIManager.put("ComboBox.buttonDarkShadow", BACKGROUND);
UIManager.put("ComboBox.buttonBackground", FOREGROUND);
UIManager.put("ComboBox.buttonHighlight", FOREGROUND);
UIManager.put("ComboBox.buttonShadow", FOREGROUND);
JComboBox<String> combo = new JComboBox<String>(makeModel()) {
private transient MouseListener handler;
private transient PopupMenuListener listener;
@Override public void updateUI() {
removeMouseListener(handler);
removePopupMenuListener(listener);
UIManager.put(KEY, new TopRoundedCornerBorder());
super.updateUI();
setUI(new BasicComboBoxUI() {
@Override protected JButton createArrowButton() {
JButton b = new JButton(new ArrowIcon(BACKGROUND, FOREGROUND));
b.setContentAreaFilled(false);
b.setFocusPainted(false);
b.setBorder(BorderFactory.createEmptyBorder());
return b;
}
@Override protected ComboPopup createPopup() {
return new BasicComboPopup(comboBox) {
@Override protected JScrollPane createScroller() {
JScrollPane sp = new JScrollPane(list) {
@Override public void updateUI() {
super.updateUI();
getVerticalScrollBar().setUI(new WithoutArrowButtonScrollBarUI());
getHorizontalScrollBar().setUI(new WithoutArrowButtonScrollBarUI());
}
};
sp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
sp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
sp.setHorizontalScrollBar(null);
return sp;
}
};
}
});
handler = new ComboRolloverHandler();
addMouseListener(handler);
listener = new HeavyWeightContainerListener();
addPopupMenuListener(listener);
Object o = getAccessibleContext().getAccessibleChild(0);
if (o instanceof JComponent) {
JComponent c = (JComponent) o;
c.setBorder(new BottomRoundedCornerBorder());
c.setForeground(FOREGROUND);
c.setBackground(BACKGROUND);
}
}
};
JPanel p = new JPanel(new GridLayout(0, 1, 15, 15));
p.setOpaque(true);
p.add(combo);
JTree tree = new JTree();
int row = 0;
while (row < tree.getRowCount()) {
tree.expandRow(row);
row++;
}
JScrollPane scroll = new JScrollPane(tree) {
@Override public void updateUI() {
super.updateUI();
getVerticalScrollBar().setUI(new WithoutArrowButtonScrollBarUI());
getHorizontalScrollBar().setUI(new WithoutArrowButtonScrollBarUI());
}
};
scroll.setBackground(tree.getBackground());
scroll.setBorder(new RoundedCornerBorder());
setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
add(scroll);
add(p, BorderLayout.NORTH);
setOpaque(true);
setPreferredSize(new Dimension(320, 240));
}
/**
* Adds a {@link PopupMenuListener} that will be registered to the buttons popup menu each time
* it is shown.
*
* @param listener
* the listener to add
*/
public void addPopupMenuListener(PopupMenuListener listener) {
otherListeners.add(listener);
}