Applet Java wyświetlający kolejne zdjęcia

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
sergo
Piegowaty Guziec
Piegowaty Guziec
Posty: 13
Rejestracja: 19 mar 2008, 21:36
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86

Applet Java wyświetlający kolejne zdjęcia

Post autor: sergo »

Cześć wszystkim Ubunciarzom :)
Od jakiegoś czasu zacząłem przygodę z Java (ale nadal jestem początkujący więc fajnie jeśli mnie nie zmieszacie z błotem) i teraz pracuję nad appletem który chciałbym później umieścić na stronie parafialnej.

Założenia appletu:

- wczytuje kilka parametrów z html: plik z listą zdjęć do wyświetlenia, katalog z tymi zdjęciami, kolor tła apletu //wczytywanie z parametrów rozwiązane
- po kliknięciu w dowolnym miejscu apletu wyświetlenie kolejnego zdjęcia //NIE ROZWIĄZANE

Moje rozwiązanie:

- wykonałem aplikację która tworzy mi plik z listą zdjęć
- listę zapisuję w ArrayList<String> i stąd pobieram nazwy wyświetlanych zdjęć po kliknięciu

Moje źródło:

Kod: Zaznacz cały

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.*;

public class ImageApp extends Applet implements MouseListener {
    
    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public ArrayList<String> images = new ArrayList<String>();
    public BufferedReader inputFile;
    public FileReader fReader;
    public BufferedImage aktualnyObraz;
    public int aktualnyNumerObrazka;
    public int iloscObrazkow;
    public String directory, file;
    
    public void init() {
		
        //wczytanie nazwy pliku z listą
        if ((file=getParameter("file"))==null) {
            System.out.println("Nie wczytano pliku");
            file="ImageList.txt";
        }

        //wczytanie nazwy katalogu ze zdjęciami
        if ((directory=getParameter("dir"))==null) {
            System.out.println("Nie wczytano katalogu");
            directory="balwanek";    
        }
         
        //zmiana koloru tła
        int colorR = Integer.parseInt(getParameter("colorR"));
        int colorG = Integer.parseInt(getParameter("colorG"));
        int colorB = Integer.parseInt(getParameter("colorB"));
        Color bgc = new Color(colorR, colorG, colorB);
        setBackground(bgc);
         
        //inicjalizacja pliku z listą zdjęć
        if ((file=getParameter("file"))==null) {
            System.out.println("Nie wczytano nazwy pliku");
            file="ImageList.txt";
        }
        
        //dodajemy linijki z pliku txt do tablicy
        try {
			BufferedReader inputFile = new BufferedReader(new FileReader(file));
			String line = "";
			while (true) {
				line = inputFile.readLine();
				if (line == null)
					break;
				imagesTable.add(line);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
        
		iloscObrazkow = images.size();
		aktualnyNumerObrazka = 0;
        
        //wywołanie metoda co wczytuje aktualnyObraz
        aktualnyObraz = wczytajObrazek(images.get(aktualnyNumerObrazka));

        //paint();

    }
    
    public void paint(Graphics g) {
        
        int imgWidth = aktualnyObraz.getWidth(this);
        int imgHeight = aktualnyObraz.getHeight(this);
        
        int x = (getWidth()-imgWidth)/2;
        int y = ((getHeight()-imgHeight)/2)-20;
        
        g.drawRoundRect(5, 5, getSize().width-10, getSize().height-10, 15, 15) ;
        g.drawImage(aktualnyObraz, x, y, this);
    }
    
    

   public BufferedImage wczytajObrazek(String url) {    
      return (BufferedImage) getImage(getCodeBase(), url);      
    }

    public void wczytajNastepnyObrazek()
    {
       
       if (aktualnyNumerObrazka == iloscObrazkow - 1)
       {
           aktualnyNumerObrazka = 0;
        }
        else
        {
           aktualnyNumerObrazka++;
        }
            
       String  url = directory + File.separator + images.get(aktualnyNumerObrazka);
       BufferedImage aktualnyObrazek = wczytajObrazek(url);
       repaint();
    }

	public void mouseClicked(MouseEvent  arg0) {

		 wczytajNastepnyObrazek();
			
	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
}
Byłbym bardzo wdzięczny gdyby mi ktoś coś podpowiedział np gdzie robię błąd albo pokazał jak należy to zrobić, może zupełnie inna koncepcja, bo przeszukując dość intensywnie google znajduje dużo różnych rozwiązań ale żadne nie pasujące do założeń które obrałem. Z góry dzięki za uwagę, pozdrawaim
Awatar użytkownika
Opalo
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 113
Rejestracja: 07 sty 2009, 09:52
Płeć: Mężczyzna

Odp: Applet Java wyświetlający kolejne zdjęcia

Post autor: Opalo »

Kod, który zapodałeś się nie kompiluje - brakuje zmiennej imagesTable. Po drugie zmienna aktualnyObrazek nie jest nigdzie wykorzystywana - korzystasz z IDE? I po trzecie, dobrym pomysłem jest korzystanie ze Swing/JFC ponieważ AWT jest przestarzałą technologią. I jeszcze jedna kwestia. Widać, że czytasz pliki z lokalnego systemu plików (pomijając fakt, że czytasz plik, ale nie przetwarzasz go), applet by mógł to robić musi być podpisany i na dodatek żeby to rozwiązanie działało każdy kto chciałby uruchomić ten aplet musiałby mieć ten plik u siebie na dysku. Generalnie to chyba się pospieszyłeś, nie chcę Cię zniechęcać, ale zacznij od czegoś łatwiejszego na początek :)
Awatar użytkownika
sergo
Piegowaty Guziec
Piegowaty Guziec
Posty: 13
Rejestracja: 19 mar 2008, 21:36
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86

Odp: Applet Java wyświetlający kolejne zdjęcia

Post autor: sergo »

Dzęki Opalo za zainteresowani. Najczęściej piszę programy w Geany i kompiluje z konsoli (bo łatwiej się czegoś nauczyć) ale oczywiście czasami również też Eclipse. Do biblioteki swing mam uprzedzenia w przypadku apletów bo nie zawsze działają tak jak powinny.
Poszedłem za twoją radą i wprowadziłem kilka uproszczeń oraz uporządkowałem kod. Kompiluje się bezbłędnie i działa również bezstresowo zarółno na Eclipse jak i appletviewer. Zdjęcia wyświetlane w formie SlideShow.
Dlaczego nie działa w obrębie przeglądarki internetowej?

Obecny kod klasy ImageApp.class:

Kod: Zaznacz cały

import java.applet.Applet;
import java.awt.*;
import java.io.*;
import java.util.*;

public class ImageApp extends Applet implements Runnable {
	
	//deklaracja zmiennych
	private static final long serialVersionUID = 1L;
	private ArrayList<String> imagesTable = new ArrayList<String>();
	private int cR, cG, cB, mSek;
	private String color, file, miliSekundy;
	private BufferedReader inputFile;
	private Image aktualneZdjecie;
	private int iloscZdjec;
	private int aktualnyNumerZdjecia = 0;
	private Thread my_thread = null;
	
	//inicjalizacja obiektów
	public void init() {
	
		//pobranie parametrów tła appletu
		if ((color=getParameter("colorR"))!=null) cR=Integer.parseInt(color);
		if ((color=getParameter("colorG"))!=null) cG=Integer.parseInt(color);
		if ((color=getParameter("colorB"))!=null) cB=Integer.parseInt(color);
		setBackground(new Color(cR,cG,cB));
		
		//pobranie parametru nazwy pliku z listą zdjęć, 
		//generowaną lokalnie przez użytkownika (programik zewnętrzny).
		//plik z listą jest umieszczony obok appletu i zdjęć
		if ((file=getParameter("file"))==null) {
			System.out.println("Nie pobrano nazwy pliku");
			file = "ImageList.txt";
		}
		
		//pobranie parametru milisekund
		if ((miliSekundy=getParameter("miliSekundy"))!=null) mSek=Integer.parseInt(miliSekundy);
		else mSek=3000;
		
		//metoda wypełnia tablicę typu ArrayList<String> i zwraca ją w postaci obietku
		myFileReader(file);
		
		//pobranie liczby wierszy z pliku
		iloscZdjec = imagesTable.size();
		
	}
	
	public void start() {
		my_thread = new Thread(this);
        my_thread.start();
	}
	
	public void run() {
		while (true) {
			if (aktualnyNumerZdjecia!=(iloscZdjec-1)) 
				aktualneZdjecie = getImage(getCodeBase(), imagesTable.get(aktualnyNumerZdjecia++));
			else {
				aktualneZdjecie = getImage(getCodeBase(), imagesTable.get(aktualnyNumerZdjecia));
				aktualnyNumerZdjecia = 0;
			}
			repaint();
			
			try {
				Thread.sleep(mSek);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}			
		}
	}
	
	private ArrayList<String> myFileReader(String nazwaPliku) {
		try {
			inputFile = new BufferedReader(new FileReader(file));
			String line = "";
			while (true) {
				line = inputFile.readLine();
				if (line == null)
					break;
				imagesTable.add(line);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return imagesTable;
	}
	
	public void paint(Graphics g) {
		
		int imgWidth = aktualneZdjecie.getWidth(this);
		int imgHeight = aktualneZdjecie.getHeight(this);
		int x = (getWidth() - imgWidth) / 2;
		int y = ((getHeight() - imgHeight) / 2) - 20;

		g.setColor(Color.WHITE);
		g.fillRect(x-10, y-10, imgWidth+20, imgHeight+50);
		g.drawImage(aktualneZdjecie, x, y, this);
	}
}
i zagnieżdżenie w html:

Kod: Zaznacz cały

<applet code="ImageApp.class" width=800 height=600>
   <param name=colorb value="121">
   <param name=colorg value="222">
   <param name=colorr value="21">
   <param name=file value="ImageList.txt">
   <param name=milisekundy value="3500">
</applet>
Przykładowa zawartość pliku ImageList.txt
100_4393.jpg
100_4394.jpg
100_4395.jpg
100_4396.jpg

...i obok źródła oczywiście fotki.

Ma ktoś pomysł dlaczego wczytując stronkę Applet nie działa? Do tej pory napisałem więcej aplikacji niż appletów więc to może jakiś szkolny błąd?
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 13 gości