2009-09-30 54 views
1

我有一个自定义的外观和感觉的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 &?我似乎无法在谷歌领域找到任何人遇到同样的问题,所以任何帮助,将不胜感激。

回答

2

我应该知道这将是答案:JLabel设置为透明,所以它的背景没有被尊重。改变这样的代码解决了这一问题真正的好:

JLabel fieldInfo = new JLabel("<html><i> " + field.desc + "</i><br/>field = " + field.getName() + "</html>"); 
fieldInfo.setOpaque(true); 
1
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

Windows Theme

雨云LAF

enter image description here

花片LAF

enter image description here

金属LAF

enter image description here

部分班级名称

/* 
# --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 
*/