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

时间:2015-06-15 20:04:16

标签: java graphics jframe awt

您好我想制作一个窗口,一个GUI,并在其中放置一个图像。

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

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

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);

}
}

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

enter image description here

您必须将图像放在与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);
        }

    }

}