如何在 JFrame 中实现 .png 图片?

How to implement .png pics in a JFrame?

你好,我想制作一个 window,一个 GUI,并在里面放一张图片。

我看了一个 YT 教程 (https://www.youtube.com/watch?v=Ap20Qw77TzY) 并复制了所有类似的东西,但我制作的 Window 根本没有图像。我尝试了不同的文件类型,如 .jpg 和不同的 window 大小,以匹配图片大小,但没有帮助。

那是我的代码,我没有得到真正的错误,除了警告:

The serializable class main does not declare a static final serialVersionUID field of type long,line 8

This method has a constructor,line 25

代码

package main;

import java.awt.Graphics;
import java.awt.Toolkit;

import javax.swing.*;

public class main extends JFrame {
/**
 * author jan
 */
public main(String title){
    super (title);
    
} 
  
public void paint(Graphics gr) {
    super.paint(gr);
    
    
    gr.drawImage(Toolkit.getDefaultToolkit().getImage("Koppenhagen\Pictures\Herz.png"), 0, 0, this);           
}


public static void main(String[] args) {
    
    main window = new main("Mein Test!");
    
    window.setSize(160,160);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setVisible(true);

}
}
  1. Toolkit.getImage 上使用 ImageIO.read,它会抛出 IOException 由于某种原因无法加载图像
  2. 检查图像的位置。您的示例正在寻找 Koppenhagen\Pictures 中相对于程序执行上下文的文件。您可以使用 File#exists 检查文件是否确实存在于您认为的位置
  3. 不要在任何 paint 方法中加载资源,加载图像可能需要时间,绘画应该 运行 尽快
  4. 我不鼓励你覆盖像 JFrame 这样的顶级容器的绘制。一个 JFrame 包含一个 JRootPane,其中包含一个 contentPane,所有这些都可以独立于其父容器进行绘制。相反,从 JPanel 开始并覆盖其 paintComponent 方法,然后将其添加到 JFrame
  5. 的实例中

这是一个简单的绘制图像的 Swing 应用程序。

您必须将图像放在与 Java 代码相同的目录中。

package com.ggl.testing;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class DrawImage implements Runnable {

    @Override
    public void run() {
        JFrame frame = new JFrame("Image");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JScrollPane scrollPane = new JScrollPane(new ImagePanel(getImage()));
        frame.add(scrollPane);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private Image getImage() {
        try {
            return ImageIO.read(getClass().getResourceAsStream(
                    "StockMarket.png"));
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new DrawImage());
    }

    public class ImagePanel extends JPanel {

        private static final long serialVersionUID = -2668799915861031723L;

        private Image image;

        public ImagePanel(Image image) {
            this.image = image;
            this.setPreferredSize(new Dimension(image.getWidth(null), image
                    .getHeight(null)));
        }

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

    }

}