即使Look and Feel UI另有规定,如何强制JPopupMenu显示标题?

Ste*_*hen 2 java swing popup menuitem

Jopadoc for JPopupMenu构造函数说明如下:

JPopupMenu的

public JPopupMenu(String label)

Constructs a JPopupMenu with the specified title.

Parameters:
    label - the string that a UI **may** use to display as a title for the popup menu.
Run Code Online (Sandbox Code Playgroud)

关键词是"可能".显然,在默认UI中,创建弹出菜单时会忽略此类标题.无论L&F是否认为我应该使用,我都非常希望在我的一些弹出菜单中使用这些标题.我无法找到它的钩子.显然,这深埋在UI代码的某个地方.有没有办法覆盖这个默认值?

如果不这样做,我尝试添加一个禁用的菜单项作为菜单的第一项.麻烦的是,我失去了对渲染的控制,它呈现出"灰色"风格,而不是作为重要标题出现.如果我不禁用它,那么它按我想要的方式呈现,但是可以选择,标题不会.

那么底线,我如何强制UI显示我的标题,或者如果失败,如何在菜单顶部添加一个不可选择的菜单项,我有完全渲染控制权?

Rom*_*áth 5

我有类似的问题(我的意思是原始问题).我这样解决了:

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.SwingConstants;

public class LabeledPopupMenu extends JPopupMenu
{
    private String originalLabelText = null;
    private final JLabel label;

    private static String replaceHTMLEntities(String text)
    {
        if (-1 != text.indexOf("<") ||
            -1 != text.indexOf(">") ||
            -1 != text.indexOf("&"))
        {
            text = text.replaceAll("&", "&amp;");
            text = text.replaceAll("<", "&lt;");
            text = text.replaceAll(">", "&gt;");
        }
        return text;
    }

    public LabeledPopupMenu()
    {
        super();
        this.label = null;
    }

    public LabeledPopupMenu(String label)
    {
        super();
        originalLabelText = label;
        this.label = new JLabel("<html><b>" +
            replaceHTMLEntities(label) + "</b></html>");
        this.label.setHorizontalAlignment(SwingConstants.CENTER);
        add(this.label);
        addSeparator();
    }

    @Override public void setLabel(String text)
    {
        if (null == label) return;
        originalLabelText = text;
        label.setText("<html><b>" +
            replaceHTMLEntities(text) +
            "</b></html>");
    }

    @Override public String getLabel()
    {
        return originalLabelText;
    }
}
Run Code Online (Sandbox Code Playgroud)

我在Mac上使用默认的L&F对它进行了测试,但它对我有用:

public static void main(String[] args)
{
    JFrame frame = new JFrame();
    frame.setSize(100, 100);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocation(100, 100);
    frame.setVisible(true);

    LabeledPopupMenu myPopup = new LabeledPopupMenu("Say & <something>");
    myPopup.add(new JMenuItem("Sample item"));
    myPopup.show(frame, 50, 50);
}
Run Code Online (Sandbox Code Playgroud)