2015-09-12 2 views
0

Мне нужно написать программу Java, которая бесконечно циклически перемещается между 10 различными изображениями с помощью PREV и NEXT JButton. Существует также выход JButton для выхода из программы. Изображение должно отображаться на центральном экране. Каждое изображение является .jpg и сохраняется в папке с именем «изображения». Имя файла для каждого изображения сохраняется в массиве. Изображения имеют имена файлов, связанные с их индексом #s в массиве (0-9). (Например, 0.jpg, 1.jpg и т. Д.) Мой код компилируется без ошибок, но ни один из моих JButtons не появляется на JFrame и изображение. Во время запуска приложения в командной строке возвращает это:Java Программа для цикла между 10 картинами

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

Вы знаете, как устанавливается ваш путь к классу? Выражение 'getClass(). GetClassLoader(). GetResource (nm)' возвращает значение null, что означает, что файлы изображений не найдены. Их, не находясь на вашем пути к классу, объяснят, как их не найти. –

+0

Чтобы построить ответ Бена, вы хотите, чтобы файлы изображений фактически находились в пакете Java в вашем проекте, если вы хотите получить к нему доступ таким образом. Вместо чтения из определенного местоположения файла на компьютере вы ищете локальный проект. Это очень полезно, так как позволяет вам переносить все ваши зависимости с помощью кода. –

+0

Извините, я немного новичок в Java. Я установил свой путь, но не мой путь к классу. Как изменить путь к классу? – MIKEY

ответ

0

Это довольно ясно из StackTrace, что проблема в этих двух строках:

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

Во-первых, StackTrace означает, что imageURL является null. (Мы не можем видеть номер строки библиотеки Java, чтобы быть абсолютно уверенным, но нет никаких других правдоподобных объяснений.)

Так как это может быть? Хорошо, если вы посмотрите на javadocs на getResource, вы увидите, что он возвращает null, если он не может найти ресурс. Следовательно ... основная причина вашей проблемы в том, что (по крайней мере) один из «/images/.jpg» изображения:

  • отсутствует в баночки и т.д. на пути к классам, или
  • имеет другое имя ресурса.

(Также возможно, что ресурс существует на пути к классам приложения, но не в пути к классам загрузчика классов, который загрузил этот класс Однако этот сценарий имеет некоторые сложные предпосылки.).

См также: https://stackoverflow.com/a/24347569/139985

+0

Я почти уверен, что у него есть правильное имя пути ресурса, если я не понимаю, как работает путь к ресурсу. Как проверить путь к классу? Объяснит ли это, почему мои другие три JButtons не появляются? – MIKEY

Смежные вопросы