尝试绘制图像时出现未知来源

时间:2013-02-06 17:42:58

标签: java image swing packaging

我试图把一些东西画到JGlassPane。像矩形这样的基本形状完美无缺。但是当我尝试绘制图像时,它总是向我显示未知来源的错误。我不知道这意味着什么,但我尝试了一切来修复它:尝试了相对/绝对路径,将图像添加为源,将其添加到构建路径,并且没有任何作用。

package soft;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
public class MapObjects 
{
    private int TypObjektu;//1-osoba,2-vozidlo,3-budova,4-custom
    private float []GPSpos;
    private String nazov;
    private String popis;
    private int userId;
    private int priority;
    private BufferedImage ikona;


    public MapObjects(String nazov,String popis,int typ)
    {
        nazov=this.nazov;
        popis=this.popis;
        TypObjektu=typ;
        File file=new File("D:/workspace/sources/iconPerson.jpg");
        try {
            ikona = ImageIO.read(file);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public Image getImage()
    {
        return ikona;
    }
    public void setAsPerson()
    {
        TypObjektu=1;
    }
    public void setAsCar()
    {
        TypObjektu=2;
    }
    public void setAsBuilding()
    {
        TypObjektu=3;
    }
    public void setAsCustom()
    {
        TypObjektu=4;
    }

}

错误讯息:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at soft.MapDrawer.paintComponent(MapDrawer.java:34)
    at soft.MapDrawer.<init>(MapDrawer.java:22)
    at gui.MainWindow.paint(MainWindow.java:189)
    at gui.MainWindow$2.actionPerformed(MainWindow.java:146)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

MapDrawer类

package soft;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;

import javax.swing.JInternalFrame;
import javax.swing.JPanel;

public class MapDrawer extends JPanel
{
     Graphics testGrafika;
     DrawerThread drawingThread;
     MapObjects objekt;

    public MapDrawer(JPanel drawPanel)
    {
        drawPanel.add(this);
        testGrafika=drawPanel.getGraphics();    
        paintComponent(testGrafika);
        objekt=new MapObjects("tada","dada",1);
        drawingThread=new DrawerThread();
        drawingThread.start();

    }

    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponents(g);
        this.setBackground(Color.WHITE);
        g.drawImage(objekt.getImage(), 50, 50, null);
    }

    public Graphics getGraphics()
    {
        return testGrafika;

    }

    public class DrawerThread extends Thread implements Runnable
    {


        @Override
        public void run()
        {
            while(true)
            {
                paintComponent(testGrafika);
                try {
                    DrawerThread.sleep(30);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:4)

你的绘画代码是完全错误的。你几乎从不直接调用paintComponent,当然也不是在这种情况下。您的Graphics对象可能为null,因为您通过调用组件上的getGraphics()来获取它,这是您不应该执行的操作,因为此对象不会持久存在。您将需要阅读绘画教程,以了解如何正确执行此操作,因为需要更改。建议包括:

  • 使用paintComponent方法绘图
  • 但不是直接打电话
  • 使用Swing Timer作为计时器循环,而不是使用while代码。
  • 使用repaint()建议JVM重新绘制组件。

同样,您可以在Google上找到的教程将解释所有这些以及更多内容。

答案 1 :(得分:3)