【问题标题】:Can not paint an image in my JPanel无法在我的 JPanel 中绘制图像
【发布时间】:2014-01-17 00:03:23
【问题描述】:

我在 GraphicsPanel(JPanel 的扩展)中绘制图像时遇到问题。我尝试使用 getCodeBase()、getDocumentBase()、getResource() 和 BufferedImage 从具有路径名的文件加载。有什么方法可以绘制图像而不必在 JLabel 中使其成为 ImageIcon?

package rpg;

import java.awt.Color;

import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JPanel;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import java.awt.image.BufferedImage;

public class GraphicsPanel extends JPanel implements MouseListener, MouseMotionListener {
private WorldBuilder wb;
public int currentTileType = 0;//tile types. 0=bgtile, 1=object, 2=NPC
public String currentTileName = "";
public Image currentTile;

public GraphicsPanel() {
    super();
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.red);
    g.fillRect(0, 0, 720, 528);
    g.drawImage(currentTile, 100, 100, this);//Nothing gets drawn here
}

public void getParameters(WorldBuilder wb) {
    this.wb = wb;
    this.currentTileType = wb.currentTileType;
    this.currentTileName = wb.currentTileName;
    /*
    try {
        currentTile = ImageIO.read(new File("SpriteSheet.png"));
    } catch (IOException e) {
        System.out.println("failed");
    }
    */
    currentTile = new ImageIcon("SpriteSheet.png").getImage();
    repaint();
}

@Override
public void mouseClicked(MouseEvent e) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void mousePressed(MouseEvent e) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void mouseReleased(MouseEvent e) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void mouseEntered(MouseEvent e) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void mouseExited(MouseEvent e) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void mouseDragged(MouseEvent e) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void mouseMoved(MouseEvent e) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

}

【问题讨论】:

  • 100x100 处绘制可能超出了组件的可见范围。 ImageIcon(String) 期望 String 是文件引用,因此如果图像是嵌入资源,则找不到图像。尝试改用ImageIO.read,因为当出现问题时它至少会抛出IOException...
  • 组件的尺寸为 720x528。我以前使用 ImageIO.read 但这也没有用。目前,我只是将图像文件与 java 文件放在同一目录中以测试它,因为直接从文件引用中读取应该可以这样工作。
  • 首先,您没有提供足够的信息来“猜测”组件大小。其次,如果图像文件与类文件(rpg)在同一个“包”中,那么文件路径是错误的,从应用程序的上下文来看,它更像rpg/SpriteSheet.png。你可以用System.out.println(new File("SpriteSheet.png").exists()); 来测试它,它很可能会打印出false。如果SpriteSheet.png 在应用程序的上下文中,那么您应该尝试改用ImageIO.read(getClass().getResource("SpriteSheet.png"))
  • 对组件尺寸感到抱歉,在我的开场白中忘了说。事实上它确实说“假”所以我猜问题可能是路径名?添加“rpg/SpriteSheet.png”后仍然显示为假。我对默认路径名不太了解。如果我的图像与我的 java 文件在同一个包中,我会使用什么。另外,如果我希望我的图像位于单独的文件夹中,我应该将文件夹放在哪里以及如何引用图像?
  • 精灵可能没有被复制到类的相同位置或被视为嵌入资源。你是如何构建你的应用程序的?你试过ImageIO.read(getClass().getResource("SpriteSheet.png"))吗?

标签: java image swing jpanel


【解决方案1】:

cmets 总结:

  • SpriteSheet.png 不在ImageIcon(String) 能够找到的位置内。 ImageIcon(String) 期望 String 引用文件系统上的 File,但 SpriteSheet.png 存储在应用程序上下文 (src/rpg/SpriteSheet.png) 中,这使其成为嵌入式资源。
  • 使用Class#getResource 加载嵌入式资源,在这种情况下,请确保使用getClass().getResource("SpriteSheet.png")getClass().getResource("/rpg/SpriteSheet.png")
  • ImageIcon 上使用ImageIO.read。当由于某种原因无法加载图像时,它至少会抛出一个IOException,而ImageIcon 可能会静默失败。
  • 确保正在加载资源的GraphicsPanel 的实例与屏幕上的实例相同

【讨论】:

  • @ixin 我已将此答案添加为我认为我们在“对话”中涵盖的要点的摘要,可以查看它们并确保我已经涵盖了要点。干杯
【解决方案2】:

以下内容对我有用。 我拿走了你的代码,并将面板添加到 JFrame。另外,在将面板添加到 JFrame 之前,我会调用 getParameters();

import java.awt.Color;

import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JPanel;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.image.BufferedImage;

public class GraphicsPanel extends JPanel implements MouseListener,
        MouseMotionListener {

    public static void main(String args[]) {
        GraphicsPanel s = new GraphicsPanel();
        s.getParameters();
        JFrame frame = new JFrame();
        frame.add(s);       
        frame.setVisible(true);     
    }

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public int currentTileType = 0;//tile types. 0=bgtile, 1=object, 2=NPC
    public String currentTileName = "";
    public Image currentTile;

    public GraphicsPanel() {
        super();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(currentTile, 100, 100, this);//Nothing gets drawn here
    }

    public void getParameters() {
        currentTile = new ImageIcon("test.jpg").getImage();
        repaint();
    }

    @Override
    public void mouseDragged(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseMoved(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseClicked(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseEntered(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }   
}

【讨论】:

  • 我在一个扩展 JFrame 的类中实现了这个 JPanel 扩展。我认为这个问题与我的文件路径名有关
  • 尝试以管理员身份运行您的应用程序。另外,尝试将图像文件放入您的 eclipse 项目中并仅使用文件名进行访问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2012-02-23
  • 1970-01-01
  • 2015-04-23
  • 2020-03-07
相关资源
最近更新 更多