0

我试着画一些东西到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();
                }
            }
        }
    }
}
4

2 回答 2

4

Your painting code is completely wrong. You almost never call paintComponent directly, and certainly not in this situation. Your Graphics object is likely null because you're getting it by calling getGraphics() on a component, something you shouldn't be doing since this object won't persist. You will want to read the painting tutorials to see how to do this correctly as much needs to be changed. Recommendations include:

  • Drawing in the paintComponent method
  • But not calling it directly
  • Using a Swing Timer for your timer loop rather than a while code.
  • Using repaint() to suggest to the JVM to repaint the component.

Again, the tutorials, which you can find with Google, will explain all of this and more.

于 2013-02-06T18:08:52.807 回答
3
于 2013-02-06T18:09:18.420 回答