Я создал раскрывающееся меню на моем Swing JToolBar. Но он не создает поведения так, как я хочу. Я нацелен на то, чтобы он работал как кнопка «Умные закладки» Firefox.Как создать меню «Выпадающее меню» на панели инструментов Java Swing?
Он исчезает, когда пользователь выбирает пункт меню: CORRECT!
Он исчезает, когда пользователь нажимает ESC: CORRECT!
Он исчезает, когда пользователь щелкает где-то в главном кадре вне меню: CORRECT!
Но она не исчезает, когда пользователь щелкает второй раз на кнопку, которая показывает выпадающее меню: некорректное ... :-(
Мой вопрос, как я могу добавить такое поведение, что она исчезает, когда нажимает на кнопку, которая показывает меню во второй раз
Вот мой текущий код из Java 6 на Mac:.
import javax.swing.*;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public class ScratchSpace {
public static void main(String[] arguments) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame("Toolbar with Popup Menu demo");
final JToolBar toolBar = new JToolBar();
toolBar.add(createMoreButton());
final JPanel panel = new JPanel(new BorderLayout());
panel.add(toolBar, BorderLayout.NORTH);
panel.setPreferredSize(new Dimension(600, 400));
frame.getContentPane().add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
private static AbstractButton createMoreButton() {
final JToggleButton moreButton = new JToggleButton("More...");
moreButton.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
createAndShowMenu((JComponent) e.getSource(), moreButton);
}
}
});
moreButton.setFocusable(false);
moreButton.setHorizontalTextPosition(SwingConstants.LEADING);
return moreButton;
}
private static void createAndShowMenu(final JComponent component, final AbstractButton moreButton) {
JPopupMenu menu = new JPopupMenu();
menu.add(new JMenuItem("Black"));
menu.add(new JMenuItem("Red"));
menu.addPopupMenuListener(new PopupMenuListener() {
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
}
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
moreButton.setSelected(false);
}
public void popupMenuCanceled(PopupMenuEvent e) {
moreButton.setSelected(false);
}
});
menu.show(component, 0, component.getHeight());
}
}
Работает как шарм ... Вопрос: как вы узнали об этом решении? Это где-то задокументировано? –
На самом деле я просто использовал мой отладчик (с прикрепленным JDK src), чтобы узнать, где и когда были запущены события. Я нашел его в BasicPopupMenuUI. – BryanD