JOptionPane.showMessageDialog后不显示背景图像

时间:2012-02-01 05:39:27

标签: java image swing concurrency

我的问题是当我使用

创建消息对话框时
JOptionPane.showMessageDialog( ... )

在显示将图像绘制为背景的JPanel的应用程序中(取自:java swing: how to add an image to a jpanel),不显示背景图像,因此我必须最小化并最大化应用程序以获取背景图像。

到目前为止,我只能通过这样的方式取回背景图片:

app.getApplication().getMainFrame().repaint();

但它仅在我关闭消息对话框后才有效。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

您发布的链接,因为他正在访问带文件的图像,这对我而言似乎不是一种访问应用程序资源的好方法,因为您必须使用URL。 看看这个示例代码,并检查出错的地方:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;    
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;

public class ImageTest extends JPanel 
{
    private BufferedImage image;

    private void displayGUI()
    {
        JFrame frame = new JFrame("Image Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        try
        {
            setImage(new URL("http://gagandeepbali.uk.to/" +
                "gaganisonline/images/planetbackground.jpg"));
        }
        catch(MalformedURLException mue)    
        {
            mue.printStackTrace();
        }


        frame.setContentPane(this);
        frame.pack();
        frame.setVisible(true);        
        JOptionPane.showMessageDialog(frame, 
                                "I am working.", 
                                "Image Working ?", 
                                JOptionPane.QUESTION_MESSAGE);
    }

    private void setImage(URL path)
    {
        try
        {       
            System.out.println(path);
            image = ImageIO.read(path);
        }
        catch(IOException ioe)
        {
            ioe.printStackTrace();
        }
    }

    @Override
    public Dimension getPreferredSize()
    {
        return (new Dimension(image.getWidth(), image.getHeight()));
    }

    @Override   
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, this);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new ImageTest().displayGUI();
            }
        });
    }
}