Java 如何将DrawImage()与随机图像数组列表一起使用

Java 如何将DrawImage()与随机图像数组列表一起使用,java,random,arraylist,drawimage,Java,Random,Arraylist,Drawimage,您好,我需要帮助从保存图像的arraylist中使用drawImage()方法绘制图像。它应该是随机的。起初,它是一个随机向下浮动的程序,但经过一些建议后,我将字母的drawString()改为图像数组列表的drawsimage()。更具体地说,这行代码就在这里g.drawImage(PicList.get($ranNum),$ranNum,y,this) 我不希望有人帮我做家庭作业。我只是需要一些人帮我弄清楚。NetBeans没有显示任何错误,但是当我启动程序并且图像应该下降时,我得到一个空指

您好,我需要帮助从保存图像的arraylist中使用drawImage()方法绘制图像。它应该是随机的。起初,它是一个随机向下浮动的程序,但经过一些建议后,我将字母的drawString()改为图像数组列表的drawsimage()。更具体地说,这行代码就在这里
g.drawImage(PicList.get($ranNum),$ranNum,y,this)
我不希望有人帮我做家庭作业。我只是需要一些人帮我弄清楚。NetBeans没有显示任何错误,但是当我启动程序并且图像应该下降时,我得到一个空指针异常。“线程中的异常”AWT-EventQueue-0“java.lang.NullPointerException”任何帮助都将不胜感激。我对Java知之甚少,事情开始让我不知所措。
这是我的全部课程。
编辑:我理解为什么会发生这个错误,我知道还有其他类似的问题。但是我的代码比那些例子要复杂一点,它们现在对我没有帮助

/*******************************************************************************    **
* LearningLetterPanel.java
 * Panel class which which uses threads and overwrites the run method
* to display a panel which has letters that go from the top of the panel
 * to the bottom. The colors are set each iteration to a new color.
* It is used by Panel class
 *********************************************************************************/

import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.*;


class LearningLetterPanel extends JPanel implements Runnable {
public static Thread letterThread = null;
private int y = 10;
static long nLetterDropped = 1;
RandNum rn = new RandNum();
int $ranNum = rn.ranNum();
String $letter = rn.ranNumLetter();
Color $letterColor= rn.ranNumColor();
    public java.util.List<Image> PicList; // here I am making a list to     store my images.

    public Image pic = null;

/***************************************************************************************
*  main method in the class for starting and stopping the thread
************************************************************************************/
LearningLetterPanel()  {
    if (letterThread == null) {
    letterThread = new Thread(this);
    letterThread.start();
        }
}

/***************************************************************************************
    *  Creates the thread and uses Thread.sleep to set the speed of the     movement
    ********************************************************************************    ****/

public void run() {
    Thread myThread = Thread.currentThread();
    while (letterThread == myThread) {
      try{
          Thread.sleep(20);
       }
       catch (InterruptedException e){}
       repaint();
        }
     }

/***************************************************************************************
* the paint method draws the letter based on color(ranNumLetter), location($ranNum and y)
* and speed (y += 3 with Thread.sleep from run())
*************************************************************************************/

    @Override
 public void paint(Graphics g) {

    g.setFont(new Font("Courier", Font.BOLD+Font.ITALIC, 48));
    g.setColor(Color.white);
    //g.drawString($letter, $ranNum, y);
    g.drawImage(PicList.get($ranNum), $ranNum, y, this);
    y += 3;
    Dimension d = getSize();
    if (y > (d.width - 10))
       {y = 10;
       LearningLetterPanel.nLetterDropped +=1;
       $ranNum = rn.ranNum();
       this.$letter = rn.ranNumLetter();
       this.$letterColor = rn.ranNumColor();
       }

    g.setFont(new Font("Courier", Font.BOLD+Font.ITALIC, 48));
    g.setColor($letterColor);
    //g.drawString($letter, $ranNum, y);

    g.drawImage(PicList.get($ranNum), $ranNum, y, this);
 }
        public void RandomImagePane() throws IOException {
        PicList = new ArrayList<Image>(25);

        // here I am adding the images to the list
        PicList.add(ImageIO.read(getClass().getResource("/images/aa.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/bb.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/cc.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/dd.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/ee.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/ff.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/gg.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/hh.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/ii.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/jj.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/kk.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/ll.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/mm.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/nn.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/oo.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/pp.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/qq.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/rr.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/ss.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/tt.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/uu.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/vv.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/ww.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/xx.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/yy.png")));
        PicList.add(ImageIO.read(getClass().getResource("/images/zz.png")));  



    }

/***************************************************************************************
*  sets thread to null which stops the thread
************************************************************************************/
 public static void stop() {
    letterThread = null;
    }

/***************************************************************************************
*  Returns the random letter when called
************************************************************************************/
public String getLetter() {
    return this.$letter;
}
  }

似乎您没有初始化列表。在引用PicList(应该命名为PicList btw,因为它是一个字段名而不是类名)之前,您需要初始化它

您已经在RandomImagePane()中编写了它,但似乎没有调用它(同样,它应该命名为initRandomImageList,小写,名称描述其用途)

(暂时坚持您的命名)修改LearningLetterPanel的结构:

LearningLetterPanel()  {
    try {
        RandomImagePane();
    } catch (IOException e) {
        throw new RuntimeException(e.getMessage(), e);
    }
    letterThread = new Thread(this);
    letterThread.start();
}

捕获IOException的替代方法是让构造函数抛出IOException,但您仍然需要在某个地方捕获它。我冒昧地删除了letterhread==null的测试,因为构造函数中总是这样(只要您只创建一个实例)

Hm,好吧,我理解错误是什么。我相信这句话是说我的单子上什么都没有。在我完成g.drawImage()之后,列表会被添加到中,所以可能就是这样,但是我应该在哪里添加它呢?不,它说没有列表。您只声明了它,但没有初始化它的地方(找不到任何调用RandomImagePane()的地方)。这可能应该在启动线程之前在LearningLetterPanel的构造函数中完成。因此我必须实例化列表,然后向其中添加内容?我环顾四周,人们展示了一个实例化arraylist的示例,但我认为我已经这样做了,你能告诉我如何调用RandomImagePane()吗?因为我认为
PicList=newarraylist(25)是这样吗?嘿,这解决了问题,谢谢!我现在得到一个索引越界错误。但在我问更多的问题之前,我会试着看一看。非常感谢。
LearningLetterPanel()  {
    try {
        RandomImagePane();
    } catch (IOException e) {
        throw new RuntimeException(e.getMessage(), e);
    }
    letterThread = new Thread(this);
    letterThread.start();
}