1

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

  • 将禁用的 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);
    

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

4

2 回答 2

1

以下对我来说很好。只需将 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);
于 2013-06-04T18:43:16.317 回答
1

对 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 ....

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

你也可以做一个JLabel,但是当然你需要做很多定位和绘图,JMenuItem/AbstractButton代码和 L&F 会为你做的。

(不要被 Swing 中的“翻转”功能所误导;它通常正好用于这种事情,但不用于菜单和菜单项。)

于 2018-09-11T20:56:32.193 回答