JOptionPane: установка пользовательского значка не влияет, когда настроен внешний вид

Я хотел бы установить пользовательский значок вместо стандартного информационного значка JOptionPane.

Я старался

ImageIcon myCustomIcon = ...;
UIManager.put("OptionPane.informationIcon", myCustomIcon);

Однако, по-видимому, это не имеет никакого эффекта из-за следующей строки:

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

Комментирование этой строки дает правильное поведение. Конечно, я пытался вставить значок в UIManager как до, так и после настройки внешнего вида. Можно ли как-то объединить два, чтобы переопределить значок информации глобально?

Я работаю над Ubuntu 10.04 прямо сейчас..

С уважением, Мортен

2 ответа

Решение

Хорошо работает для меня, используя Metal и Windows LAF.

Возможно, ваш LAF не поддерживает свойство UIManager. Проверьте UIManager по умолчанию для списка свойств.

Если вам нужна дополнительная помощь, опубликуйте свой SSCCE, который демонстрирует проблему.

Вы пытались указать свой значок после настройки внешнего вида, таким образом:

JOptionPane.showMessageDialog(frame,
    "Eggs are not supposed to be green.",
    "Inane custom dialog",
    JOptionPane.INFORMATION_MESSAGE,
    myCustomIcon);

Обновить:

Следующий код отлично работает на моей Windows 7:

import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class OptionPaneIcon {
    public static void main (String[] args) {
        ImageIcon myCustomIcon = loadImageIcon("image.png");
        UIManager.put("OptionPane.informationIcon", myCustomIcon);
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException ex) {
        } catch (InstantiationException ex) {
        } catch (IllegalAccessException ex) {
        } catch (UnsupportedLookAndFeelException ex) {
        }
        JOptionPane.showMessageDialog(null, "Hello!");
    }

    /** Returns an ImageIcon, or null if the path was invalid. */
    private static ImageIcon loadImageIcon(String path) {
        URL imgURL = OptionPaneIcon.class.getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL);
        } else {
            System.err.println("Couldn't find file: " + path);
                return null;
        }
    }
}

PS Извините за мое нетерпение.

Другие вопросы по тегам