【问题标题】:How do I draw an image to a JPanel or JFrame?如何将图像绘制到 JPanel 或 JFrame?
【发布时间】:2021-02-13 03:10:50
【问题描述】:

如何将图像绘制到 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);

提前致谢!

【问题讨论】:

  • 你的代码是直接解决问题或讨厌编程语言的方法 (whatever.getGraphics()) 1. 请阅读 Oracle 教程Working with Images,在paintComponent 标记的帖子中搜索此处或JLabelIcon/ImageIcon
  • 我已经在问题的第一部分中说明了我阅读了有关使用图像的 Oracles 教程。我真的不能理解你说的第一件事......
  • 查看@tieTYT 的回答,从paintComponent(忘了paint())和JPanel 开始,需要为JPanel 覆盖getPreferredSize(忘了JFrame.setSize()),然后调用JFrame.pack ()(在这里搜索,关于画图、形状、线条的一半问题)

标签: java swing jframe jpanel bufferedimage


【解决方案1】:

试试这个:

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


}

【讨论】:

  • 非常感谢!正是我想要的。我对在 java 中使用图像非常陌生,完全迷失了。
  • 你能举例说明如何调用paintComponent 方法吗?看起来应该是 pane.paintComponent(),但我不明白 g 会传递什么参数。
  • @redeagle47 这是个好问题,但不幸的是我不知道答案(或者我忘记了)。这只是您承诺 Swing 将实施的合同。您如何获得 g 的详细信息来自 Swing 内部,而不是您编写的任何代码。 Swing 渲染 JPanel 并在渲染时调用 paintComponent。如果您覆盖该方法,它将以您的方式而不是默认方式绘制。
  • 哦,实际上我正在阅读文档,我想我明白了。我认为 pane.repaint() 将是正确的方法;它应该通过更高级别的容器调用paintComponent()。我不是 100% 认为这是正确的语法,但就是这样。
  • 它实际上只是 repaint() 本身
【解决方案2】:

有很多方法,但我总是覆盖JComponentpaint(Graphics g)并使用g.drawImage(...)

编辑:我正在制作一个样本,但 Daniel Kaplan 做得很完美,看看他的回答 :)

【讨论】:

    猜你喜欢
    • 2012-02-23
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 2015-03-31
    相关资源
    最近更新 更多