Java程序在10张图片之间循环

时间:2015-09-12 02:46:27

标签: java arrays

我需要编写一个Java程序,使用PREV和NEXT JButton无限循环10个不同的图像。还有一个退出JButton退出该程序。图像需要显示在中央屏幕中。每个图像都是.jpg,存储在名为“images”的文件夹中。每个图像的文件名存储在一个数组中。这些图片的文件名与数组中的索引#s相关联(0-9)。(例如0.jpg,1.jpg等等)我的代码编译没有错误,但我的JButton都没有出现在JFrame也不是图像。在运行应用程序时,命令提示符返回:

C:\Users\Mikey\Desktop>java test
0. images/0.jpg
Exception in thread "main" java.lang.NullPointerException
        at javax.swing.ImageIcon.<init>(Unknown Source)
        at test.loadIcons(test.java:31)
        at test.<init>(test.java:47)
        at test.main(test.java:39)

这是我的代码:

import java.awt.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import java.net.URL;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.JLabel;
import java.awt.BorderLayout;
import java.awt.event.*;

public class test extends JFrame implements ActionListener {

private ImageIcon icon;
ImageIcon[] Pictures = new ImageIcon[10]; //array for file names

int clicks = 0; //increment by button clicks
JLabel picHolder = null;

public void loadIcons() { //begin load icons
    int i;
    for (i = 0; i < 10; i++) { //begin for loop
        String nm = String.format("images/%d.jpg",i);
        System.out.printf("%d. %s\n",i,nm);
        URL imageURL = getClass().getClassLoader().getResource(nm);
        icon = new ImageIcon(imageURL);
        Image o = icon.getImage();
        System.out.printf("%s\n",o.toString());
        Pictures[i] = icon;
    } //end for loop
} //end load icons

public static void main(String[] n) {
    test o = new test();
}
public test() {
    setSize(800,500);
    setVisible(true);
    setLocationRelativeTo(null);
    setTitle("Mikey's Slideshow");

    loadIcons(); //loods file names into array

    JButton prev = new JButton("PREV");
    JButton next = new JButton("NEXT");
    JButton quit = new JButton("QUIT");

    JPanel p_middle = new JPanel();
        picHolder = new JLabel((Icon)Pictures[0]);
        p_middle.add(picHolder);
        p_middle.setPreferredSize(new Dimension(400,200));

    JPanel p_bottom = new JPanel();

    JLabel l1 = new JLabel("Go Broncos!");

    p_bottom.setLayout(new BorderLayout());
    p_bottom.add(quit,BorderLayout.SOUTH);
    p_bottom.add(l1,BorderLayout.NORTH);
    p_bottom.add(prev,BorderLayout.LINE_START);
    p_bottom.add(next,BorderLayout.LINE_END);

    quit.addActionListener(this);
    prev.addActionListener(this);
    next.addActionListener(this);

    add(p_middle,BorderLayout.CENTER);
    add(p_bottom,BorderLayout.SOUTH);
    add(l1,BorderLayout.NORTH);
}

public void updatePic(int e) { //begin update pic
        System.out.printf("%s\n",Pictures[e]);
        picHolder.setIcon((Icon)Pictures[e]);
} //end update pic

public void actionPerformed(ActionEvent e) {
    String a = e.getActionCommand();
    if (a.equals("QUIT")) {System.exit(0);} //system exits 
    if (a.equals("NEXT")) {clicks++; if (clicks>9) {clicks=0;} updatePic(clicks);} //next picture
    if (a.equals("PREV")) {clicks--; if (clicks<0) {clicks=9;} updatePic(clicks);} //previous picture
}
} //end class 

提前谢谢!

1 个答案:

答案 0 :(得分:0)

从堆栈跟踪中可以清楚地看出问题出在以下两行:

    URL imageURL = getClass().getClassLoader().getResource(nm);
    icon = new ImageIcon(imageURL);

首先,堆栈跟踪意味着imageURLnull。 (我们无法确定Java库行号是绝对可靠的,但没有其他合理的解释。)

那怎么可能呢?好吧,如果你查看getResource的javadoc,你会看到如果它找不到资源,它会返回null。因此......问题的根本原因是(至少)其中一个&#34; /images/.jpg"图像:

    类路径上的JAR等缺少
  • ,或
  • 具有不同的资源路径名。

(资源也可能存在于应用程序的类路径中,但不存在于加载此类的类加载器的类路径中。但是,该场景有一些复杂的前提条件。)

另请参阅:https://stackoverflow.com/a/24347569/139985