将静态文本添加到Java Swing菜单的最佳方法是什么?

时间:2013-06-04 17:55:09

标签: java swing menu jlabel jpopupmenu

我想在弹出菜单中包含一些静态文本。我希望它看起来像任何其他菜单项,只是不可选择。我试过的方法:

  • 将禁用的JMenuItem添加到菜单中。虽然这会导致正确的字体和对齐方式,但会导致文本以浅灰色呈现并几乎无法读取。

  • 将JLabel添加到菜单中。这看起来很难看;标签使用与常规菜单项不同的字体,并且没有对齐相同(菜单项为左侧的图标留出空间,标签不会这样做。)

    JPopupMenu popupMenu = new JPopupMenu();
    JLabel label = new Label("Static text);
    popupMenu.add(label);
    JMenuItem menuItem = new JMenuItem("Disabled menu item);
    menuItem.setEnabled(false);
    popupMenu.add(menuItem);
    menuItem = new JMenuItem("Regular item);
    popupMenu.add(menuItem);
    

我是否缺少一些其他方法来将静态文本添加到菜单中,该菜单使用与常规菜单项相同的字体和对齐方式,但是无法选择,不接受键盘焦点并且当鼠标悬停在其上时不会突出显示?

2 个答案:

答案 0 :(得分:0)

以下对我来说很好。只需将JLabel添加到JPanel并将JPanel添加到JPopupMenu

JPanel panelLabel = new JPanel();       
JLabel lblSomeText = new JLabel("Some text");
lblSomeText.setFont(menuItem.getFont());
lblSomeText.setForeground(menuItem.getForeground());
panelLabel.add(lblSomeText);
popupMenu.add(panelLabel);

答案 1 :(得分:0)

对于OP来说,为时已晚,但是无需费力地进行L&F猜测就可以完成同一件事的一种简单方法是,删除事件侦听器,该事件侦听器会在鼠标经过按钮时突出显示按钮。

JMenuItem menuItem = ......
if (menuItem.getModel() instanceof DefaultButtonModel) {
    DefaultButtonModel model = (DefaultButtonModel)menuItem.getModel();
    model.setArmed(false);
    for (ChangeListener cl : model.getChangeListeners()) {
        //System.err.format("yep, removing %s%n", cl);
        model.removeChangeListener(cl);
    }
}
menuItem.setFocusable(false);
menuItem.setForeground ....
menuItem.setBackground ....
menuItem.setFont ....
menuItem.setHorizontalAlignment ....

请注意,这有点极端,因为如果在“现在是标签的按钮”上注册了任何 other 事件监听器,它们也会被忽略,并且没有任何意义。区分它们的方法。

您也可以执行JLabel,但是当然您需要进行JMenuItem / AbstractButton代码和L&F所做的大量定位和绘制工作为你。

(而且不要被Swing中的“翻转”功能所迷惑;它通常正是用于这种事情,但是在菜单和菜单项中不使用。)