我该如何将图像绘制到JPanel或JFrame中?

18

我该如何将一张图片绘制到JPanel或JFrame上?我已经阅读了Oracle关于此的教程,但似乎无法实现。我需要将名为"BeachRoad.png"的图片显示在特定的坐标上。这是我目前的代码。

public class Level1  extends JFrame implements ActionListener {

static JLayeredPane EverythingButPlayer;
static Level1 l1;

public Level1() {
    EverythingButPlayer = new JLayeredPane();

    BufferedImage img = null;
    try {
        img = ImageIO.read(new File("BeachRoad.png"));
    } catch (IOException e) {
    }
    Graphics g = img.getGraphics();
    g.drawImage(img,0, 0, EverythingButPlayer);


    this.add(EverythingButPlayer);
}

并且在Main()函数中,

l1 = new Level1();
l1.setTitle("poop");
l1.setSize(1920, 1080);
l1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
l1.setVisible(true);

提前感谢!


1
你的代码是通往麻烦和讨厌编程语言的直接途径(whatever.getGraphics())。请阅读Oracle教程Working with Images,在帖子中搜索标记为paintComponentJLabel,并使用Icon/ImageIcon - mKorbel
我在问题的第一部分已经说明了我阅读了Oracle关于图像处理的教程。但是我真的不太理解你所说的第一件事... - Saucymeatman
请参考@tieTYT的答案,从paintComponent(忘记了paint()和JPanel)开始,需要覆盖getPreferredSize(忘记了JFrame.setSize())来为JPanel设置大小,然后调用JFrame.pack()(在这里搜索,一半的问题都是关于绘制图像、形状、线条的)。 - mKorbel
2个回答

34

试试这个:

package com.sandbox;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class SwingSandbox {

    public static void main(String[] args) throws IOException {
        JFrame frame = buildFrame();

        final BufferedImage image = ImageIO.read(new File("C:\\Projects\\MavenSandbox\\src\\main\\resources\\img.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;
    }


}

1
非常感谢!正是我所需要的。我在使用Java中的图像方面非常新手,完全不知所措。 - Saucymeatman
1
@redeagle47,这是个好问题,但很抱歉我不知道答案(或者我忘了)。这只是一个合同,你承诺实现 Swing。获取 g 的详细信息来自于 Swing 内部而非任何你编写的代码。Swing 渲染 JPanel 并在此时调用 paintComponent。如果你重写该方法,它将绘制成你想要的样子而非默认的方式。 - Daniel Kaplan
哦,实际上我正在阅读文档,我想我已经弄清楚了。我认为pane.repaint()应该是正确的方法;它应该通过更高级别的容器调用paintComponent()。我不确定这是否是正确的语法,但大致是这样的。 - redeagle47
它实际上只是单独的repaint()。 - redeagle47
@DanielKaplan:完美的回答。 - Jad Chahine
显示剩余2条评论

4
有很多方法,但我经常覆盖JComponentpaint(Graphics g)并使用g.drawImage(...)编辑:我正在制作一个样例,但是Daniel Kaplan做得很好,请看他的答案 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接