2009-09-30 55 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 
*/