about adding a BufferedImage to the JPanel



我仍在学习Java Swing工具包及其工作原理。我正在研究如何将图像添加到JFrame(通过JPanel)的不同方法,并找到了这个教程(在这里)。我的问题与我设置源代码的方式有关:

public class GraphicsPracticeDrawing extends JPanel{
    private BufferedImage img;
    public GraphicsPracticeDrawing() {
            this.setBackground(Color.BLACK);
            //Initialize(); //Program runs with no error/warning, but nothing appears in frame
    }
    //method initialized the BufferedImage
    public void Initialize() {
            try {
                    img = ImageIO.read(new File("images/star.jpg"));
            } catch (IOException e) {
                    e.printStackTrace();
            }
    }
    public void paint(Graphics g) {
            super.paint(g);
            Initialize(); //initialize the BufferedImage
            g.drawImage(img, 25, 25, null);
    }

}

如果我拿走Initialize方法并将try/catch(初始化我的图像)放入构造函数中,我的代码编译并运行,但我最终得到一个空白窗口。如果我把try/catch放到paint中,就像我的源代码中显示的那样,我的程序运行得很好,图像加载,黑色背景,等等。

TLDR; Image1是我在构造函数中初始化时发生的情况,imag2是当它运行良好并在我的paint方法中初始化时发生的情况。(Take a Look)

为什么我不能在构造函数中初始化我的图像?

如果paint()被调用,构造函数将被调用,这是保证的。你正在显示的空白屏幕意味着在你的paint方法中抛出了一个异常。试试这个。注释掉图像绘制代码,并将图像加载代码移回构造函数。现在运行它。你看到黑色了吗?如果你这样做了,那么你就知道这是毫无例外的绘画。如果不是,那你就有另一个问题了。检查控制台是否有异常。如果你有黑色,取消注释图像绘制代码。你看到灰色了吗?那么我打赌你的图像没有在构造函数中加载,而且paint方法抛出了一个异常。检查你的控制台,你会看到为什么它不工作的异常。如果没有,在IO上放置一个断点。读行,看看你得到的值。

你也要把paint()改为paintComponent()。我不认为这会解决你的问题,但是你会想要遵从Swing的绘制架构。

现在,当您将initialize()方法放入paint方法中时,您正在从文件系统中读取,创建新图像,为其分配内存,绘制它,然后丢弃它,并在绘制下一帧时再次执行所有这些操作。如果您没有意识到这一点,那么这会为垃圾收集器创建大量垃圾。您希望在构造函数中将此图像读入内存一次,并从此以后从该内存中绘制。

相关内容

最新更新