【问题标题】:Background image is not displayed after JOptionPane.showMessageDialogJOptionPane.showMessageDialog 后不显示背景图片
【发布时间】:2012-02-01 05:39:27
【问题描述】:

我的问题是当我使用创建消息对话框时

JOptionPane.showMessageDialog( ... )

在显示 JPanel 的应用程序上,该 JPanel 将图像绘制为背景(取自:java swing: how to add an image to a jpanel),背景图像不显示,因此我必须最小化和最大化应用程序才能恢复背景图像。

到目前为止,我只能通过执行以下操作来取回背景图像:

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

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

有什么想法吗?

【问题讨论】:

  • “有什么想法吗?” 为了尽快获得更好的帮助,请发帖 SSCCE。对于与图像相关的 SSCCE,generate them in codehot-link 给他们。
  • 我发现这个错误只发生在 JOptionPane 是模态的时候。
  • null 更改为this,它应该适用于模态对话框。如果没有,请发布 SSCCE。

标签: java image swing concurrency


【解决方案1】:

您发布的链接,因为他正在使用文件访问图像,在我看来这不是访问应用程序资源的好方法,因为您必须使用 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();
            }
        });
    }
}

【讨论】:

  • paintComponent 的无效实现(记住:JPanel 的 opaque 属性默认为 true :-)
  • JPanel 对于每个LookAndFeel 来说确实不是不透明的。对于某些 LookAndFeel 来说,它不是。
  • 那又怎样 - 因为它在一些奇怪的 LAF 中不小心违反了合同,所以让它在其他地方违反是正确的? -1
猜你喜欢
  • 2020-09-11
  • 1970-01-01
  • 2018-08-10
相关资源
最近更新 更多