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