Почему JLabel в JPopupMenu не уважает свой внешний вид? - PullRequest
1 голос
/ 01 октября 2009

У меня есть Java-приложение с пользовательским интерфейсом, в котором пользователь может переключаться между светлым и темным режимом. У нас есть всплывающее меню, вызываемое правой кнопкой мыши, которое наследуется от класса JPopupMenu. Первое, что мы добавим в меню - это JLabel:

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

Теперь мы изменили L & F для JLabels, и они правильно отображаются в нескольких местах в стилях приложения. Мы изменили:

Label.background
Label.foreground

Кроме того, L & F для MenuItems также был изменен с помощью:

PopupMenu.border
PopupMenu.foreground
PopupMenu.background

Для чего бы то ни было, мы также изменили аналогичные свойства в MenuItems.

Проблема в том, что метка, которая появляется во всплывающем меню, кажется, не соответствует цвету фона. Цвет переднего плана изменяется при переключении между светлым и темным режимом, но цвет фона - нет. Я сделал снимок экрана и уронил цвет, заданный для цвета фона, и не смог найти совпадения нигде в наших настройках L & F, что, по-видимому, говорит о том, что он просто использовал L & F по умолчанию (возможно, Windows).

Возможно, это ошибка? Или я не устанавливаю какое-либо свойство L & F, которым я должен быть? Кажется, я не смог найти никого в сфере Google с такой же проблемой, поэтому любая помощь будет признательна.

Ответы [ 2 ]

2 голосов
/ 01 октября 2009

Я должен был знать, что это будет ответом: JLabel был установлен прозрачным, поэтому его фон не учитывался. Изменение кода, подобного этому, решило проблему очень приятно:

JLabel fieldInfo = new JLabel( "<html><i> " + field.desc + "</i><br/>field = " + field.getName() + "</html>" );
fieldInfo.setOpaque( true );
1 голос
/ 27 июня 2016
  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 Theme

Nimbus LAF

enter image description here

Мотив LAF

enter image description here

Металл LAF

enter image description here

Некоторые ClassName

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