无法在java中加载图像,有人可以看到有什么问题吗?

时间:2015-03-16 02:41:18

标签: java swing jframe loading drawimage

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class MainWindow extends JFrame{

    public static void main(String[] args) {

        JFrame mainWindow = new JFrame("Siege Arena");
        mainWindow.setResizable(false);
        mainWindow.setVisible(true);
        mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainWindow.setSize(500, 500);
        loadpics();

    }   

    Image bg;

    public void loadpics(){
        bg = new ImageIcon("C:\\test\\Background.png").getImage();
        repaint();

    }
    public void paint(Graphics g){
        g.drawImage(bg,0,0,null);

    }



}

我要做的就是创建一个JFrame并将一个简单的图像加载到它上面,我该怎么做。在这里,我试过,但失败了。有人能帮助我吗?

1 个答案:

答案 0 :(得分:2)

  

有人能看出出了什么问题吗?

  • JFrame扩展,您没有添加任何新功能,而是将您自己锁定在组件的单​​次使用中
  • 覆盖paint顶级容器,例如JFrame,很容易(就像你有的话)打破油漆链,不会产生任何问题
  • 不调用super.paint并打破画颜链
  • 未将ImageObserver传递给ImageIcon
  • 尝试加载图片时引用错误的MainWindow实例。

如果我“猜测”正确,您正在尝试将背景图像绘制到窗口中。如果是这样,那么你尝试的方式就是DEFIANTLY而不是解决问题的方法。

,而不是...

  • 从自定义组件开始,该组件从JPanel
  • 扩展而来
  • 使用paintComponent方法绘制图像
  • 考虑使用ImageIO代替ImageIcon。如果无法加载图片,ImageIO将抛出异常。

例如......

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setContentPane(new BackgroundPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class BackgroundPane extends JPanel {

        private BufferedImage bg;

        public BackgroundPane() {
            try {
                bg = ImageIO.read(new File("C:\\test\\Background.png"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return bg == null ? new Dimension(200, 200) : new Dimension(bg.getWidth(), bg.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (bg == null) {
                Graphics2D g2d = (Graphics2D) g.create();
                int x = (getWidth() - bg.getWidth()) / 2;
                int y = (getHeight() - bg.getHeight()) / 2;
                g2d.drawImage(bg, x, y, this);
                g2d.dispose();
            }
        }

    }

}

看看:

了解更多详情...