Ste*_*hen 2 java swing popup menuitem
Jopadoc for JPopupMenu构造函数说明如下:
JPopupMenu的
public JPopupMenu(String label)
Run Code Online (Sandbox Code Playgroud)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.
关键词是"可能".显然,在默认UI中,创建弹出菜单时会忽略此类标题.无论L&F是否认为我应该使用,我都非常希望在我的一些弹出菜单中使用这些标题.我无法找到它的钩子.显然,这深埋在UI代码的某个地方.有没有办法覆盖这个默认值?
如果不这样做,我尝试添加一个禁用的菜单项作为菜单的第一项.麻烦的是,我失去了对渲染的控制,它呈现出"灰色"风格,而不是作为重要标题出现.如果我不禁用它,那么它按我想要的方式呈现,但是可以选择,标题不会.
那么底线,我如何强制UI显示我的标题,或者如果失败,如何在菜单顶部添加一个不可选择的菜单项,我有完全渲染控制权?
我有类似的问题(我的意思是原始问题).我这样解决了:
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("&", "&");
text = text.replaceAll("<", "<");
text = text.replaceAll(">", ">");
}
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)