setImageIcon не устанавливает значок JFrame в окне Mac Swing

Я уже пробовал загружать код из стека. По какой-то причине это просто не устанавливает ImageIcon для моего JFrame, комментарии - это другие попытки, которые не сработали, я избегал вызова super, чтобы я мог ссылаться на JFrame - GUIPhotoAlbum extends JFrame; код:

public GUIPhotoAlbum ()
{
    super("PhotoAlbum");
    ImageIcon img = new ImageIcon("Photos/albumIcon.png");
    this.setIconImage(img.getImage());

    /*
    try{
        setIconImage(ImageIO.read(new File("Photos/albumIcon.png")));
    }catch(Exception e){
        System.out.print("Didn't work.");
    }
    */

    setSize(875, 625);
    this.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    this.setLayout(new BorderLayout(5, 5));

    initComponents();
    initMenuBar();

    initTopPanel();
    add(topPanel, BorderLayout.CENTER);

    initBottomPanel();
    add(bottomPanel, BorderLayout.SOUTH);

    addListeners();

    setLocationRelativeTo(null);
    setVisible(true);
}

РЕДАКТИРОВАТЬ Я запускаю программу, как это, где я пытаюсь установить ImageIcon JFrame в GUIPhotoAlbum() конструктор; вот водитель:

public class AlbumDriver
{   
    public static void main (String [ ] args)
    {
           SwingUtilities.invokeLater 
           (
                 new Runnable()
                 {
                        @Override
                        public void run()
                        {
                            GUIPhotoAlbum pa = new GUIPhotoAlbum();
                        }   
                 }
           ); 
    }

}

Что я здесь не так делаю? PS я пробовал BufferedImage, ImageIcon, с помощью File.. и я использую Mac

3 ответа

Решение

Mac не поддерживает значки кадров, как видно из этого ответа.

Используйте это, чтобы изменить Dock Image в Mac:

File imageFile = new File("Your image Path");
Image image =  ImageIO.read(imageFile);
Application.getApplication().setDockIconImage(image);

Для окон используйте это:

YourFrameObject.setIconImage(image);

Проблема в том, что ваш класс расширяется от JFrame но вы создаете новый экземпляр JFrame и вместо этого установить его значок...

JFrame newFrame = new JFrame("PhotoAlbum");

ImageIcon img = new ImageIcon("Photos/albumIcon.png");
newFrame.setIconImage(img.getImage());

Не создавайте второй экземпляр JFrameнет необходимости newFrame в этом случае...

Например...

public GUIPhotoAlbum ()
{
    super("PhotoAlbum");
    ImageIcon img = new ImageIcon("Photos/albumIcon.png");
    setIconImage(img.getImage());

    /*
       //when uncommented, exception is never thrown
    try{
        setIconImage(ImageIO.read(new File("Photos/albumIcon.png")));
    }catch(Exception e){
        System.out.print("Didn't work.");
    }
    */

    // Hint use pack instead, but only after
    // You've finished adding the components to the frame
    setSize(875, 625);
    setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    setLayout(new BorderLayout(5, 5));

    initComponents();
    initMenuBar();

    initTopPanel();
    add(topPanel, BorderLayout.CENTER);

    initBottomPanel();
    add(bottomPanel, BorderLayout.SOUTH);

    addListeners();

    setLocationRelativeTo(null);
    setVisible(true);
}
Другие вопросы по тегам