首页 > 解决方案 > 图像未在 JFrame 中显示

问题描述

我已经尝试了一个小时,但由于某种原因,我似乎无法让我的图像显示在JFrame画布上。我用谷歌搜索了很多其他问题,但没有一个可以提供帮助。将图像输入到框架后,我需要在其上放置文本,但我可以这样做,但我似乎无法显示图像。也更新了。

import java.util.*;
import java.awt.*;
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.*;

public class Meme extends JPanel{
    public BufferedImage img;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Generate();
    }

    public static void Generate() {
        //Creating the frame
        JFrame mainframe = new JFrame("Meme");
        mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainframe.setSize(800, 800);
        mainframe.setVisible(true);
    }

    /**
     * @param g
     */
    @Override
    public void paint(Graphics g) {
        try {
            img = ImageIO.read(new File("pic.jpg"));
            g.drawImage(img, 50, 50, this);
        } catch (IOException e) {
        }
    }
}

标签: javaimageswing

解决方案


呃..这个(短)单一方法有很多问题:

public void paint(Graphics g) {
    try {
        img = ImageIO.read(new File("pic.jpg"));
        g.drawImage(img, 50, 50, this);
    } catch (IOException e) {
    }
}
  1. 覆盖任何JComponent(或其扩展,如JPanel)的正确方法是paintComponent(Graphics).
  2. 任何覆盖的绘制方法都应立即调用超级方法以确保绘制 BG 和边框,从而擦除任何先前绘制的元素。
  3. 永远不应该在paint方法中读取图像,这仅用于绘画而不是执行任何“长时间运行”的任务,例如加载图像。将该代码移动到构造函数或Generate方法(顺便说一句,应该是小写首字母, IE generate
  4. 应用程序资源(例如图像 - 我猜它是应用程序的固有部分。)将在部署时成为嵌入式资源,因此明智的做法是立即开始访问它们。嵌入式必须通过 URL 而不是文件访问。查看信息。嵌入资源的页面,了解如何形成 URL。
  5. } catch (IOException e) { }上面有人说这似乎很“愚蠢”-因为确实如此。代码忽略或破坏了那些非常方便的堆栈跟踪,这可能有助于解释直接和最相关的问题。将其更改为以} catch (IOException e) { e.printStackTrace(); }获取更多信息。

编辑

我刚刚注意到其他可能是此代码“不行”的东西。Generate方法是唯一从方法中调用的东西main。它绝不会创建 aMeme并将其添加到框架中!你到底期望什么出现在画面中?

编辑 2

这是上面的代码重新设计以包含上面的建议,以及更多。它没有解决所有潜在问题或包括所有可能的优化。

这是结果:

在此处输入图像描述

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.*;
import javax.imageio.ImageIO;
import javax.swing.*;

public class Meme extends JPanel {

    public BufferedImage img;

    Meme() {
        /* This next statement is purely for debugging. If the GUI is not red 
         inside the frame decorations, something is very wrong. */
        setBackground(Color.RED);
        try {
            //img = ImageIO.read(new File("pic.jpg"));
            img = ImageIO.read(new URL("https://i.stack.imgur.com/7bI1Y.jpg"));
            generate();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

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

    public void generate() {
        //Creating the frame
        JFrame mainframe = new JFrame("Meme");
        mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainframe.add(this);
        mainframe.setSize(600, 500);
        mainframe.setVisible(true);
    }

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

推荐阅读