2015-10-27 237 views
1

我试图在JPanel上绘制.png。我使用ImageIcon构造函数将其导入,并将其绘制在我的自定义面板的paintComponent中。ImageIcon.paintIcon不会在JPanel上绘制图像

sscce

package mypackage; 

import java.awt.Graphics; 

import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class MyPanel extends JPanel { 

    static JFrame frame; 
    static MyPanel panel; 
    static ImageIcon icon; 

    public static void main(String[] args) { 
     icon = new ImageIcon(MyPanel.class.getResource("MyImage.png")); 
     frame = new JFrame(); 
     panel = new MyPanel(); 
     frame.setSize(500, 500); 
     frame.add(panel); 
     frame.setVisible(true); 
     frame.repaint(); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     icon.paintIcon(panel, g, 100, 100); 
    } 
} 

我预想的形象,这仅仅是在白色背景上一对夫妇的形状,在(100, 100)面板上显示。相反,一个空白屏幕:

Blank panel where I expected my image to be drawn

没有发生错误的事实意味着该程序正确查找文件。

的形象在我的Eclipse项目在同一个包中的类:

Project setup

这究竟是为什么?我如何解决它?

+1

不要建立在你的paintComponent方法的ImageIcon。也可以尝试在面板中绘制一个圆圈或其他东西。 – matt

+0

@matt将'icon = new ImageIcon(MyPanel.class.getResource(“MyImage.png”));'移到'main'并在'main'上面添加'静态ImageIcon图标'并不能解决问题。 – snickers10m

+0

@matt此外,添加'((Graphics2D)g).draw(新的Ellipse2D.Double(100,100,100,100));''paintComponent'成功绘制一个圆圈。 – snickers10m

回答

3

由于代码看起来正确,我建议资源未被正确加载。

将png文件放在你的类路径中。例如。我会有一个目录:

~/ProjectRoot/resources/mypackage/ 

然后在类路径中包含资源。 In eclipse you can setup the classpath via

项目 - >属性 - > Java构建路径 - >添加类文件夹

BufferedImage img = 
    ImageIO.read(MyPanel.class.getResourceAsStream("MyImage.png")); 

,如果未找到该图片引发异常。您可以使用它来制作一个ImageIcon。

2

当您使用ImageIcon从文件读取图像时,不会指示读取是否成功。

这是你的GUI,我读出的图像使用的ImageIO:

Image on GUI

而这里的形象,在同一个目录中的Java源:

enter image description here

这里是你的代码,我使用ImageIO读取来读取图像,并在paintComponent方法中绘制图像。

package com.ggl.testing; 

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.SwingUtilities; 

public class MyPanel extends JPanel { 

    private static final long serialVersionUID = -9008812738915944216L; 

    private static JFrame frame; 
    private static MyPanel panel; 
    private static Image image; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       image = getImage(); 
       frame = new JFrame(); 
       panel = new MyPanel(); 
       frame.setSize(500, 500); 
       frame.add(panel); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(image, 100, 100, MyPanel.this); 
    } 

    private static Image getImage() { 
     Image image = null; 
     try { 
      image = ImageIO.read(MyPanel.class.getResource("maze.jpg")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return image; 
    } 
}