【问题标题】:Trying to draw an image on a JFrame试图在 JFrame 上绘制图像
【发布时间】:2018-05-28 11:32:41
【问题描述】:

我正在尝试在 JFrame 上绘制图像,但它似乎不起作用。这是绘制图像的面板:

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;

public class GraphicsPanel extends JPanel {

public BufferedImage image;

public GraphicsPanel(){

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

这是 JFrame:

import java.awt.Dimension;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Spelplan extends javax.swing.JFrame {

public static BufferedImage image;
public static GraphicsPanel pane;

public Spelplan() {
    try {
        image = ImageIO.read(new File("*IMAGE PATH*"));  
    }
    catch(IOException e) {
        System.out.println("Image not found");
    }

    pane = new GraphicsPanel(); 
    pane.setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
    pane.setVisible(true);

    initComponents();
    this.setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
    this.add(pane);
    this.pack();
    pane.repaint();        
}

当程序运行时,JFrame 以正确的大小显示,但没有绘制图像。知道我做错了什么吗?

【问题讨论】:

  • 您似乎从未加载任何要绘制的图像?你只需将它加载到你的 Spelplan 类中,除了使用它的大小之外,它什么都不做。您可能应该使用g.drawImage(Spelplan.image, [...]
  • 欢迎来到 SO。你得到什么错误?我没有看到GraphicsPanel 中的image 被初始化。您可能希望将构造函数更改为 GraphicsPanel(BufferedImage image)
  • @c0der 我没有收到任何错误,但是图像从未绘制。图像在 JFrame 中初始化并且是公开的。
  • @Ben 我使用面板中的图像来绘制它。
  • 你为什么不使用JLabel呢?

标签: java swing jframe paintcomponent


【解决方案1】:

BufferedImage image 可能是公开的,但 GraphicsPanel 从不访问它。
无论如何,最好将image 保持私有并使用getter 来访问它,或者将引用传递给构造函数:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class Spelplan extends javax.swing.JFrame {

    public static BufferedImage image;
    private String imagePath = "https://upload.wikimedia.org/wikipedia/commons/3/3f/Crystal_Project_bug.png";

    public Spelplan() {
        try {
            URL url = new URL(imagePath);
            image = ImageIO.read(url);
        }
        catch(IOException e) {
            System.out.println("Image not found");
        }

        add(new GraphicsPanel(image));
        pack();
        setVisible(true);
    }

    public static void main(String[] args){
        new Spelplan();
    }
}

class GraphicsPanel extends JPanel {

    private BufferedImage image;

    public GraphicsPanel(BufferedImage image){
        this.image = image;
        setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
    }
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, null);
    }
}

始终发布mcve 并使用照片网址,以便其他人可以运行您的代码。

【讨论】:

  • 感谢您的帮助!有效!但是,现在我想在此面板顶部放置一个按钮或标签,它们没有显示。你知道如何解决这个问题吗?
猜你喜欢
  • 1970-01-01
  • 2020-08-01
  • 1970-01-01
  • 2012-02-23
  • 2015-03-31
  • 2012-10-17
  • 2012-04-03
  • 1970-01-01
相关资源
最近更新 更多