【问题标题】:Failing to draw Image to JFrame无法将图像绘制到 JFrame
【发布时间】:2015-03-31 11:27:10
【问题描述】:

首先我想为任何错误道歉,我的英语说得不好,我是 Java 新手,我是 Stackoverflow 新手。请善待!

我一直无法在屏幕上绘制简单的图像。我尝试了一切,但我一直失败,我越来越困惑。这是我的源代码:

package com.Animation;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.awt.Graphics2D;
import java.awt.Point;
import javax.imageio.ImageIO;
import javax.swing.JFrame;

@SuppressWarnings("serial")

public class Class1 extends JFrame{

private BufferedImage backgroundImg;

public Class1(){
    this.setTitle("Animation");
    this.setSize(1080, 720);
    this.setLocationRelativeTo(null);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);
    LoadContent();
    }


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

private void LoadContent()
{
    try
    {
        URL backgroundImgUrl = this.getClass().getResource("Back.jpg");
        backgroundImg = ImageIO.read(backgroundImgUrl);
    }
    catch (IOException ex) {
        System.err.println("Fehler!");
    }
}

public void Draw(Graphics2D g2d)
{
    g2d.drawImage(backgroundImg, 0, 0, null);
}

}

所以发生的情况是,一个 JFrame 窗口打开,上面什么都看不到。我认为这是因为 Draw() 方法没有被调用。但是当我添加像“Draw(g2d);”在某个地方,我不断收到 NullPointerException。图片“Back.jpg”与班级位于同一包中。我正在使用 eClipse 和 JRE JavaSE 1.7。

我真的希望你能帮助我,因为我试图找出问题所在,我已经筋疲力尽了。如果您可以将正确的代码写入答案并解释我做错了什么,那就太酷了。请记住,我对这一切都是陌生的。

非常感谢!

【问题讨论】:

    标签: java eclipse image swing jframe


    【解决方案1】:

    有很多方法可以做到这一点。例子

    1)JLabel。 //不推荐
    在您的JFrame 中添加JLabel,然后执行label.setIcon(backgroundImg);

    2) JPanel
    覆盖JPanel 中的paint() 方法(确保已将其添加到JFrame)。

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

    【讨论】:

    • 如何将它添加到我的 JFrame 中?
    • LoadContent();之后,添加add(label);add(panel),然后添加pack();
    • 先学习Java。你必须构造一个新的JPanel,初始化它,在LoadContent();之后和}之前添加这些代码add(panel); pack();
    【解决方案2】:

    试试这个。这里我将图像设置为 JPanel,而不是直接设置为 JFrame。

    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.WindowConstants;
    
    /**
     *
     * @author Rumesh
     */
    public class Test extends JFrame{
    
        public static void main(String[] args) throws IOException {
            JFrame frame = buildFrame();
    
            final BufferedImage image = ImageIO.read(new File("1.jpg"));
    
            JPanel pane = new JPanel() {
                @Override
                protected void paintComponent(Graphics g) {
                    super.paintComponent(g);
                    g.drawImage(image, 0, 0, null);
                }
            };
    
    
            frame.add(pane);
        }
    
    
        private static JFrame buildFrame() {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            frame.setSize(200, 200);
            frame.setVisible(true);
            return frame;
        }
    
    }
    

    【讨论】:

    • 请添加说明您的代码解决问题的原因,以便提问者了解他们做错了什么。
    • 正如 Arkanon 已经说过的,我无法理解您为什么要这样做。所以我复制了代码并用我的替换了一些对象名称,但我得到了大量的错误。
    • 你能告诉我有什么错误吗?至于为什么它不适用于您的代码,我不确定为什么。所以这就是为什么我为你创造了另一种方式来完成你的任务。如果您能提供您在我的代码中遇到的错误,我会帮助您解决它们。
    • 线程“主”javax.imageio.IIOException 中的异常:无法读取输入文件!在 javax.imageio.ImageIO.read(Unknown Source) at com.Animation.Class1.main(Class1.java:17)
    • @Joey,正确导致文件无法创建,您不应该直接复制+粘贴他的代码,而是应该修改它。 (你应该用Back.jpg替换1.jpg
    【解决方案3】:

    我不知道这是否是您要搜索的内容:

    ImageIcon image = new ImageIcon("src/media/Image.jpg");
    JLabel lblImg = new JLabel("", image, JLabel.CENTER);
    lblImg.setBounds(..., ..., ..., ...);
    add(lblImg);
    

    通过这种方式,您可以将图像添加到 JLabel 中,然后将其放置在屏幕上。我希望它在某种程度上有所帮助。

    【讨论】:

    • 1) File 在部署时不起作用。请改用URL。 2) 加载图片时使用ImageIO 进行反馈。 ImageIcon 构造函数将静默失败。
    • 不过对我有用。
    • 那么显然你没有部署你的项目,或者没有将它们部署为 Jars。
    • 现在我明白了,我确实不明白。
    猜你喜欢
    • 2012-02-23
    • 1970-01-01
    • 2016-10-01
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 2012-04-03
    相关资源
    最近更新 更多