为什么JPopupMenu中的JLabel不尊重其外观和感觉?
问题描述:
我有一个自定义的外观和感觉的Java应用程序,用户可以在其中切换光线和黑暗模式。我们所拥有的一个功能是从JPopupMenu类继承的右键单击弹出式菜单。我们添加到菜单的第一件事是一个JLabel:为什么JPopupMenu中的JLabel不尊重其外观和感觉?
add(new JLabel("<html><i> " + field.desc + "</i><br/>field = " + field.getName() + "</html>"));
现在,我们已经改变为L & F代表的JLabel,它们出现在应用程序样式可以正常相当多的地方。我们已经修改:
Label.background
Label.foreground
此外,将L & F到的MenuItems也已通过修改:
PopupMenu.border
PopupMenu.foreground
PopupMenu.background
对于它的价值,我们也对修改的MenuItems类似的性质。
问题是,在弹出式菜单中出现的标签似乎并不尊重背景颜色。在亮和暗模式之间切换时,前景色会改变,但背景色不会。我做了一个屏幕抓取并且滴眼了背景色设置的颜色,并且在我们的L设置中的任何地方都找不到匹配,这似乎暗示它仅仅使用了默认的L(大概是Windows)在上面。
这也许是一个错误?或者我是不是应该设置一些L属性F &?我似乎无法在谷歌领域找到任何人遇到同样的问题,所以任何帮助,将不胜感激。
答
我应该知道这将是答案:JLabel设置为透明,所以它的背景没有被尊重。改变这样的代码解决了这一问题真正的好:
JLabel fieldInfo = new JLabel("<html><i> " + field.desc + "</i><br/>field = " + field.getName() + "</html>");
fieldInfo.setOpaque(true);
答
public static void changeLaf(JComponent component, String laf) {
try {
UIManager.setLookAndFeel(laf);
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
}
SwingUtilities.updateComponentTreeUI(component);
}
如何使用它?
changeLaf(/*your JPopupMenu*/, /*your ClassName laf*/);
这里
JPopupMenu pmLAF = new JPopupMenu();
JMenuItem miRandomColor = new JMenuItem("Set Random Color");
JMenuItem miWhiteColor = new JMenuItem("Set White Color");
JMenuItem miDefaultColor = new JMenuItem("Set Default Color");
pmLAF.add(miRandomColor);
pmLAF.add(miWhiteColor);
pmLAF.addSeparator();
pmLAF.add(miDefaultColor);
JLabel lblMetal = new JLabel(" Metal ");
lblMetal.setBorder(BorderFactory.createEtchedBorder());
JLabel lblMotif = new JLabel(" Motif ");
lblMotif.setBorder(BorderFactory.createEtchedBorder());
JLabel lblNimbus = new JLabel(" Nimbus ");
lblNimbus.setBorder(BorderFactory.createEtchedBorder());
我把LAF固定标签和可变JPopupMenu的
changeLaf(pmLAF, /*Change LAF String*/);
changeLaf(lblMetal, "javax.swing.plaf.metal.MetalLookAndFeel");
changeLaf(lblMotif, "com.sun.java.swing.plaf.motif.MotifLookAndFeel");
changeLaf(lblNimbus, "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
的Windows LAF
雨云LAF
花片LAF
金属LAF
部分班级名称
/*
# --laf javax.swing.plaf.mac.MacLookAndFeel
# --laf apple.laf.AquaLookAndFeel
# --laf com.apple.laf.AquaLookAndFeel
# --laf com.sun.java.swing.plaf.gtk.GTKLookAndFeel
# --laf com.sun.java.swing.plaf.motif.MotifLookAndFeel
# --laf com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel
# --laf com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel
# --laf com.sun.java.swing.plaf.windows.WindowsLookAndFeel
# --laf javax.swing.plaf.basic.BasicLookAndFeel
# --laf javax.swing.plaf.metal.MetalLookAndFeel
# --laf javax.swing.plaf.multi.MultiLookAndFeel
# --laf javax.swing.plaf.synth.SynthLookAndFeel
# --laf javax.swing.plaf.nimbus.NimbusLookAndFeel
# --laf it.unitn.ing.swing.plaf.macos.MacOSLookAndFeel
*/