我试图把一些东西画到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();
}
}
}
}
}
答案 0 :(得分:4)
你的绘画代码是完全错误的。你几乎从不直接调用paintComponent,当然也不是在这种情况下。您的Graphics对象可能为null,因为您通过调用组件上的getGraphics()
来获取它,这是您不应该执行的操作,因为此对象不会持久存在。您将需要阅读绘画教程,以了解如何正确执行此操作,因为需要更改。建议包括:
同样,您可以在Google上找到的教程将解释所有这些以及更多内容。
答案 1 :(得分:3)
图标的透明度可能会出现问题
Icon / ImageIcon,改为放入Jlabel
此处发布的代码无法提示切割器,发布SSCCE,简短,可运行,可编辑,而是使用Java built_in图标(来自JOptionPane
fe)