2014-10-29 56 views
0

我想绘制多个图像取决于是否Booleantrue或不。但是,当boolean变成true或不是,我得到一个NullPointerException涉及任何与我的方法。 (在代码中注释特别指向哪里),我99%肯定它是因为图形,它的nullNullpointerException当我使用我自己的多种方法来绘制图像

基本上我也问如何解决这个问题,以及如何在一个类中使用我自己的方法正确地绘制图像。我知道如何在一个班级中的每个图片上做到这一点,但我的方式不仅仅是2张图片,我想我差不多有100张,所以我不想制作100个类(:|)。这里是我的代码:图片类的

列表:

public class Images{ 
    public static Toolkit tk = Toolkit.getDefaultToolkit(); 
    public static final Image Image1 = tk.getImage("src/images/image1.png"), Image2 = tk.getImage("src/images/image2.png"); 
    public ImageObserver observer = null; //i just did this for no reason 
    public static Graphics g = Main.graphics; 
    public void paintImage1(Graphics g){ 
     Images.g = g; 
     g.drawImage(Image1, 10, 10, observer); //NullPointerException points here, even if I replace 'pbserver' with null 
    } 
    public void paintImage2(Graphics g){ 
     Images.g = g; 
     g.drawImage(Image2, 10, 10, observer); //strangely, it doesn't point here 
    } 
} 

然后,我举在我的课堂上使用它与我的布尔绘制的图像,像这样:

public class PaintHandler{ 
    public static Graphics graphics = Images.g; 
    public void PaintImages(boolean upheld){ 
     if (upheld){ 
     Images.paintImage1(graphics);//NullPionterException points here 
     } 
     else if (!upheld){ 
     Images.paintImage2(graphics);//doesn't point here for some reason 
     } 
    } 
} 

异常也指向我用来制作upheldtrue的键盘绑定方法,另一件奇怪的事情。

和以前一样,我不想为每一张照片做一个班级,我更喜欢他们是否都在一个班级。另外,当我尝试在我使用的JFrame上使用getGraphics()时,我通过这个GIGANTIC循环来做静态事物和不能将静态条件应用于非静态上下文之间,比如使静态变量变为静态,但之后它说不能用在静态的上下文中,但是当你不把它变成静态的时候,一个不同的变量表示把它改回静态,你不会使它成为静态的,并且你会经历这个巨大的循环,改为不是静态的(对于长时间的解释抱歉,试图具体说明)。

+0

不要'src'载入图像,当应用程序构建的部署,他们将不存在... – MadProgrammer 2014-10-29 05:22:23

+0

1)更快地提供帮助,发布[MCVE](http://stackoverflow.com/help/mcve)(最小完整可验证示例)。 2)请参阅[什么是堆栈跟踪,以及如何使用它来调试我的应用程序错误?](http://stackoverflow.com/q/3988788/418556)&[什么是空指针异常,以及如何我修复它?](http://stackoverflow.com/q/218384/418556)3)总是复制/粘贴错误和异常输出! – 2014-10-29 06:32:14

回答

2

“当我尝试在JFrame IM使用getGraphics()使用” - 请勿,这不是如何自定义的画是在Swing做。 getGraphics在最好情况下会返回最后一次涂料循环的快照,任何涂在它上面的涂料都会在下一次涂料循环中涂漆,最差的情况下将返回null

看看Painting in AWT and SwingPerforming Custom Painting为金锭细节画画在Swing如何工作以及你应该如何使用它?

相反,创建你自己的自定义组件,从东西像扩展和JPanel使用它是paintComponent来绘制你的图像。

通常情况下,存储在src内容将提供您的应用程序嵌入的资源(这将取决于你的IDE和构建系统),但总体来讲,你不应该含有src,这应该路径访问任何资源成为潜在问题的直接阅读标志。

在您应该使用Class#getResource加载资源这种情况下...

public class Images{ 
    public static final Image Image1 = tk.getImage(Images.class.getResource("/images/image1.png")); 

例如。

我会使用Toolkit.getImage,因为它会使用一个后台线程加载图像,并不会引发任何异常,如果图像没有被加载

使用ImageIO.read取而代之的考虑,看到Reading/Loading an Image对你望而却步更多细节

和以前一样,我不想为每个图像创建一个类,如果它们都在同一个类中,我会更喜欢它。此外,当我尝试使用 来使用我在使用的JFrame上的getGraphics()时,我通过这个 GIGANTIC循环将静态条件应用到非静态上下文之间,例如静态变量, 但后来它说不能在静态环境中使用,但随后当你 不让它静态不同的变量表示,它变回 静态的,你不把那个静态的,你去通过这个巨大循环 之间使其静态和更改为不是静态的(对不起,对于长的 解释,试图具体)。

您的图片可以存储在任何你喜欢的地方,也许在某种Map。但是它们必须在有效的上下文中绘制,即组件的绘制方法。您可以在单一组件内绘制你想要的图像或扩散出来,如果你愿意的话,这就是TP起来......

与静态的问题,可能是因为你是......

  1. 仍在main方法,它是静态的和/或
  2. 到你没有创建一个实例来试图引用(非静态)变量其他类。

只有一个可运行的例子将突出哪些(如果不是两个)

+0

感谢这一切帮助!关于Toolkit.getImage的事情是我使用它,因为每当我使用ImageIO.read日食给我一个未处理的IOException蝙蝠,甚至没有运行它:( – Abob 2014-10-30 02:01:27

+0

是的,这是关键,所以你将无法使用它来初始化你的领域,你需要使用一种方法来加载图像(或一个构造函数),但是现在你有控制权来决定如果图像没有加载时该怎么做 – MadProgrammer 2014-10-30 02:03:21