如何在Java秋千工具栏中创建“下拉菜单”菜单?
-
19-09-2019 - |
题
我在秋千JToolbar上创建了一个下拉菜单。但这并不能像我想要的那样行为。我的目标是使它像Firefox的“智能书签”按钮一样工作。
当用户选择菜单项时,它会消失:正确!
当用户按ESC:正确!
当用户单击菜单外部主框架的某个地方时,它会消失:正确!
但是,当用户在显示下拉菜单的按钮上第二次单击时,它不会消失:不正确... :-(
我的问题是如何添加此行为,当单击第二次显示菜单的按钮时,它确实会消失。
这是我当前的代码,来自Mac上的Java 6:
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());
}
}
解决方案
好吧,这是一个潜在的解决方案,并非没有缺点。只有您可以决定是否可以接受您的申请。问题在于,弹出式关闭发生在其他鼠标处理事件发射之前,请单击您的更多信息。.按钮再次使弹出窗口隐藏起来,从而将按钮状态重置为在按钮甚至被告知按下按钮。
简单的解决方法是在您的主要程序中添加以下调用:
UIManager.put("PopupMenu.consumeEventOnClose", Boolean.TRUE);
结果是,每当由于鼠标压制事件而关闭弹出菜单时,该鼠标事件将在关闭菜单时消费,并且不会传递给鼠标下的任何其他组件。如果您可以限制限制,那么这是一个简单的解决方案。
其他提示
发生的事情是,当您单击菜单时,它会取消弹出菜单,因此您将其取消选择按钮,但是下一个即时事件是单击按钮,现在已将其取消选择,因此它再次显示菜单。
我还没有确切的解决方案,但是请给我一点...
我不使用firefox,所以我不知道智能书签按钮是什么样子,但也许使用jmenu作为“按钮”。您可以尝试使用jbutton的边框使其看起来更像一个按钮。
好吧,按钮上的侦听器仅在按下时就会做出反应,因为您会听 ItemEvent.SELECTED
仅活动。如果要听的话,添加另一个子句怎么样 ItemEvent.DESELECTED
事件在这里:
moreButton.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
createAndShowMenu((JComponent) e.getSource(), moreButton);
}
}
});
您可以存储对 menu
某处, 或者 您可以使菜单本身将另一个侦听器添加到按钮中。后一个解决方案可能更简单,因为您似乎已经向菜单发送了一个按钮引用。