Ste*_*eod 9 java swing menu jtoolbar drop-down-menu
我在Swing JToolBar上创建了一个下拉菜单.但它并没有按照我想要的方式创造行为.我的目标是像Firefox的"智能书签"按钮一样工作.
当用户选择菜单项时,它会消失:正确!
当用户按下ESC时,它会消失:CORRECT!
当用户点击菜单外的主框架中的某处时,它会消失:正确!
但是当用户第二次点击显示下拉菜单的按钮时,它不会消失:INCORRECT ... :-(
我的问题是如何添加这种行为,当点击第二次显示菜单的按钮时,它确实消失了.
这是我目前的代码,来自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());
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,这是一个潜在的解决方案,并非没有缺点。只有您可以决定是否可以接受您的应用程序。问题是弹出窗口关闭发生在触发其他鼠标处理事件之前,因此再次单击您的“更多..”按钮会导致弹出窗口隐藏,因此在得知按钮被按下之前将按钮状态重置为取消选择状态。
一种简单的解决方法是在您的主程序中添加以下调用:
UIManager.put("PopupMenu.consumeEventOnClose", Boolean.TRUE);
Run Code Online (Sandbox Code Playgroud)
这样的结果是,每当由于鼠标按下事件而关闭弹出菜单时,该鼠标事件将在菜单关闭时被消耗,并且不会传递给鼠标下的任何其他组件。如果您可以有限度地生活,这是一个简单的解决方案。
| 归档时间: |
|
| 查看次数: |
15818 次 |
| 最近记录: |