1

我有一个具有自定义外观的 Java 应用程序,用户可以在其中切换明暗模式。我们拥有的东西之一是从 JPopupMenu 类继承的右键单击弹出菜单。我们添加到菜单中的第一件事是 JLabel:

add( new JLabel( "<html><i> " + field.desc + "</i><br/>field = " + field.getName() + "</html>" ) );

现在,我们更改了 JLabels 的 L&F,它们正确地出现在应用程序样式的很多地方。我们修改了:

Label.background
Label.foreground

此外,MenuItems 的 L&F 也通过以下方式修改:

PopupMenu.border
PopupMenu.foreground
PopupMenu.background

值得一提的是,我们还修改了 MenuItems 上的类似属性。

问题是弹出菜单中出现的标签似乎不尊重背景颜色。在明暗模式之间切换时,前景色会发生变化,但背景色不会。我做了一个屏幕抓取并滴下背景颜色设置的颜色,在我们的 L&F 设置中找不到任何匹配项,这似乎表明它只是使用了默认的 L&F(可能是 Windows)就可以了。

这可能是一个错误吗?还是我没有设置一些我应该设置的 L&F 属性?我似乎无法在谷歌领域找到任何有同样问题的人,所以任何帮助都将不胜感激。

4

2 回答 2

2

我应该知道这将是答案:JLabel 设置为透明,因此它的背景没有得到尊重。像这样更改代码确实很好地解决了问题:

JLabel fieldInfo = new JLabel( "<html><i> " + field.desc + "</i><br/>field = " + field.getName() + "</html>" );
fieldInfo.setOpaque( true );
于 2009-09-30T22:14:44.667 回答
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 固定为 Labels 并更改为 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");

视窗 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
*/
于 2016-06-27T02:12:54.470 回答