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

问题描述 投票:1回答:2

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

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

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

java swing menu jlabel jpopupmenu
2个回答
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);

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

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

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

(并且不要被Swing中的“翻转”功能误导;它通常适用于此类事物,但不会在菜单和菜单项中使用。)

© www.soinside.com 2019 - 2024. All rights reserved.