Как добавить ImageIcon в JDialog?

Я попытался создать плавающее диалоговое окно, содержащее GIF-изображение загрузчика и некоторый текст. У меня есть следующий класс:

public class InfoDialog extends JDialog {
    public InfoDialog() {
        setSize(200, 50);
        setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
        setUndecorated(true);
        setLocationRelativeTo(null);

        URL url = InfoDialog.class.getClassLoader().getResource("loader.gif");
        ImageIcon loading = new ImageIcon(url);
        getContentPane().add(new JLabel("Logging in ... ", loading, JLabel.CENTER));
    }
}

Однако, когда я звоню:

   InfoDialog infoDialog = new InfoDialog()
   infoDialog.setVisible(true);

Отображается пустой диалог. Значок изображения и метка не отображаются в диалоговом окне.

Что я сделал не так в этом коде?

Большое спасибо.


person Kevin    schedule 10.02.2013    source источник
comment
Если вы перестанете добавлять .gif, он хотя бы покажет текст? Выбрасываются ли какие-либо исключения? Это выглядит хорошо для меня.   -  person BeRecursive    schedule 10.02.2013
comment
Вы показываете infoDialog в EDT?   -  person Vishal K    schedule 10.02.2013
comment
Также рассмотрите возможность загрузки изображения в фоновом режиме.   -  person trashgod    schedule 10.02.2013
comment
Предполагая, что loader.gif содержится в вашем Jar и выходит из пакета по умолчанию, попробуйте добавить / в начало пути, т.е. /loader.gif   -  person MadProgrammer    schedule 11.02.2013


Ответы (2)


Изображения обычно помещаются в исходную папку «ресурс»,

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

package com.foo;

import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class Demo 
{
    private static final String IMAGE_URL = "/resource/bar.png";

    public static void main(String[] args) 
    {
        createAndShowGUI();
    }

    private static void createAndShowGUI()
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run() 
            {
                try
                {
                    JDialog dialog = new JDialog();     
                    dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
                    dialog.setTitle("Image Loading Demo");

                    dialog.add(new JLabel(new ImageIcon(ImageIO.read(getClass().getResourceAsStream(IMAGE_URL)))));

                    dialog.pack();
                    dialog.setLocationByPlatform(true);
                    dialog.setVisible(true);
                } 
                catch (IOException e) 
                {
                    e.printStackTrace();
                }
            }
        });
    }
}

продюсировать Моргана Фримена.

введите здесь описание изображения

person mre    schedule 10.02.2013
comment
+1 для ImageIO.read(), но ImageIcon может напрямую использовать URL, возвращенный getResource(). - person trashgod; 10.02.2013
comment
@trashgod, +1, но я хотел использовать getResourceAsStream - person mre; 10.02.2013

Я бы добавил ImageIcon к JLabel, а затем добавил JLabel к JDialog contentPane, а затем this.validate и this.repaint в конструкторе.

Для отладки иногда нужен реальный код, без которого это всего лишь предложения, основанные на предположениях.

person Horizon    schedule 10.02.2013
comment
Почему validate() и repaint() перед setVisible()? К сожалению, я не вижу pack(). - person trashgod; 10.02.2013