我想在弹出菜单中包含一些静态文本。我希望它看起来像任何其他菜单项,只是不可选择。我试过的方法:
将禁用的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);
我是否缺少一些其他方法来将静态文本添加到菜单中,该菜单使用与常规菜单项相同的字体和对齐方式,但是无法选择,不接受键盘焦点并且当鼠标悬停在其上时不会突出显示?
答案 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中的“翻转”功能所迷惑;它通常正是用于这种事情,但是在菜单和菜单项中不使用。)