Aplet i struktura katalogów

0

Cześć,
chcę napisać aplet, który będzie w przeglądarce wyświetlał obrazki. Obrazki znajdują się w katalogu images/, który jest w tym samym katalogu co plik html. Nie jest powiedziane ile jest plików w katalogu i jakie mają nazwy, można jednak założyć że na pewno są to obrazki.
Mam taki kod


package imageviewer;

import javax.swing.JApplet;
import java.awt.*;
import java.awt.image.*;
import java.io.File;

public class ImageViewerApp extends JApplet
{
    public ImageViewerApp()
    {
    }

    @Override
    public void init()
    {
        File file = new File(getDocumentBase().getPath());
        file = file.getParentFile(); //teraz jest w katalogu w ktorym mamy images/ i plik .html
        file = new File (file.getPath() + "/images/");
        images = file.list();
        number = images.length;
        current = 0;
        for (String str: images)
            System.out.println(str);
        img = getImage(getDocumentBase(), "images/"+images[0]);
    }
    @Override
    public void paint(Graphics gr)
    {
        this.setBackground(new Color(0,0,0,0));
        gr.clearRect(0, 0, getSize().width, getSize().height);
        gr.drawImage(img, 0, 0, this);
    }
    @Override
    public boolean imageUpdate(Image img, int flags, int x, int y, int width, int height)
    {
        if ( (flags & ImageObserver.ALLBITS) == 0 )
        {
            showStatus("Ładowanie obrazu...");
            return true;
        }
        else
        {
            showStatus("Obraz załadowamy!");
            repaint();
            return false;
        }
    }
    protected int current, number;
    protected Image img;
    protected String[] images;
}
 

"Run file" w IDE uruchamia aplet i działa on dobrze, tzn. rysuje pierwszy obrazek z katologu. Jednak uruchomienie go appletviewerem z konsoli powoduje wygenerowanie wyjątku

$ appletviewer ImageViewerApp.html 
java.security.AccessControlException: access denied (java.io.FilePermission /home/grzes/Programy/NetBeansProjects/ImageViewer/build/images read)
	at java.security.AccessControlContext.checkPermission(AccessControlContext.java:342)
	at java.security.AccessController.checkPermission(AccessController.java:553)
	at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
	at java.lang.SecurityManager.checkRead(SecurityManager.java:888)
	at java.io.File.list(File.java:988)
	at imageviewer.ImageViewerApp.init(ImageViewerApp.java:34)
	at sun.applet.AppletPanel.run(AppletPanel.java:436)
	at java.lang.Thread.run(Thread.java:636)
 

Widać że jest protest przy metodzie list z klasy File, nie wiem jednak jak to obejść. Proszę o pomoc w poprawieniu programu.

0

Troche inaczej twórz obiekt file:

        try
        {
            File file;
            file = new File(new URL(getCodeBase(),"images").toURI());
            images = file.list();
            number = images.length;
            current = 0;
            for (String str: images)
                System.out.println(str);
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
0

Zgodnie z radą bo przekształciłem metodą init do takiej postaci

@Override
    public void init()
    {
        try
        {
            File file = new File(new URL(getDocumentBase(),"images").toURI());
            images = file.list();
            number = images.length;
            current = 0;
            for (String str: images)
                System.out.println(str);
        }
        catch(Exception e)
        {
            e.printStackTrace();
            System.out.println();
        }
        img = getImage(getDocumentBase(), "images/"+images[0]);
    } 

Jednak nadal nie jest dobrze. Znowu aplet uruchomiony z IDE działa, ale w appletviewer'ze lub w przeglądarce już nie. Na konsoli wyświetlane jest

 java.security.AccessControlException: access denied (java.io.FilePermission /home/grzes/Programy/NetBeansProjects/ImageViewer/build/images read)
	at java.security.AccessControlContext.checkPermission(AccessControlContext.java:342)
	at java.security.AccessController.checkPermission(AccessController.java:553)
	at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
	at java.lang.SecurityManager.checkRead(SecurityManager.java:888)
	at java.io.File.list(File.java:988)
	at imageviewer.ImageViewerApp.init(ImageViewerApp.java:34)
	at sun.applet.AppletPanel.run(AppletPanel.java:436)
	at java.lang.Thread.run(Thread.java:636)

java.lang.NullPointerException
	at imageviewer.ImageViewerApp.init(ImageViewerApp.java:45)
	at sun.applet.AppletPanel.run(AppletPanel.java:436)
	at java.lang.Thread.run(Thread.java:636)

Nadal metoda list generuje wyjątek. To że go przechwytuję nie pomaga, bo lista nazw obrazków nie jest wczytywana, czyli tablica image ma wartość null i po chwili mam kolejny wyjątek. java.lang.NullPointerException at imageviewer.ImageViewerApp.init(ImageViewerApp.java:45) odnosi się właśnie do linii img = getImage(getDocumentBase(), "images/"+images[0]);

0

Wydaje mi się, że przy pomocy standardowej Javy więcej nie uzyskasz:

       URL url=new URL(getCodeBase(),"images");
       getAppletContext().showDocument(url,"_blank"); //(**) to jest niepotrzebne do odczytania nazw plików
       byte[] bufor=new byte[10000];
       InputStream is=url.openStream();
       is.read(bufor);
       is.close();

W tablicy bufor masz nazwy plików. Jak uruchomiłem aplet lokalnie, to miałem tylko nazwy plików, jak wrzuciłem go na serwer, to miałem w niej kod strony wyświetlanej wierszem (**).

1 użytkowników online, w tym zalogowanych: 0, gości: 1