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
  • 集中的な描画に GlassPaneを使用しないでください

  • 集中的な描画に JViewportを使用しないでください

  • アイコンの透過性に問題がある可能性があります

  • 代わりに Icon / ImageIcon を Jlabel に配置

  • JXLayer(Java6)ベースのJLayer(Java7)を使用

  • ここに投稿されたコードについては、包丁を提案することはできません。SSCCEを投稿し、短く、実行可能で、コンパイル可能で、代わりに Java built_in Icons を使用してください ( JOptionPanefe から)

于 2013-02-06T18:09:18.420 に答える