Problem z apletem

0

Witam,
piszę applet w Netbeans.
Uruchamiam go poprzez Clean and Build -> prawym na główną klasę -> Run File.
Otwiera mi się okno appletu, wszystko ładnie.
Ale gdy przejdę do katalogu build i otwieram powstały plik html, nie jest już tak różowo...
Wyświetla się tylko czarny prostokąt.
Umieszczając applet na samodzielnie napisanej stronie, efekt jest ten sam.
Gdzie leży błąd?
Może nie powinienem umieszczać panelu i labeli w metodzie init() ?
Mogę wkleić kod.

Proszę o pomoc,
pozdrawiam.

0

Może opiszę dokładniej problem.
Chcę napisać applet. W głównym pliku, w metodzie init() umieściłem BorderLayout. W polach North i South są Labele, a w polu Center Panel.
Tworzenie i rysowanie tła na panelu odbywa się w osobnej klasie Panel.
Na tym panelu będę chciał rysować obiekty, zdefiniowane w innych klasach.
Jak to wszystko połączyć? Szczególnie chodzi mi o metodę paint().

0

Metoda init jest wywoływana przez jeden z wątków przeglądarki przeznaczonych dla sandboxa (w skrajnym wypadku każda metoda apletu init, start, stop, destroy są wywoływane przez osobne wątki stworzone przez przeglądarkę). Wywoływanie kodu Swinga bezpośrednio z tych metod jest proszeniem się o kłopoty. Powinieneś stworzyć klasę implementującą interfejs Runnable, która będzie w metodzie run() konstruowała obiekty Swinga (na panelu dostarczanym przez przeglądarkę) i tę klasę powinieneś w metodzie init odpalić przez wywołanie invokeAndWait(twojaKlasa). Może być ona anonimowa bo i tak sprowadza się do wywołania jakiejś metody np. createGUI() - tyle, że już z wątku Swinga.

Metoda paint() może pochodzić z klasy panelu jaki sobie napiszesz i załadujesz w createGUI(). Wtedy będzie ona poprawnie obsługiwana przez Swinga.

Twoim bieżącym problemem jest jednak co innego. Czarny prostokąt oznacza zazwyczaj to iż przeglądarka nie znalazła obiektu klasy, którą stworzyłeś. Otwórz sobie konsolę javy w przeglądarce aby to sprawdzić. Przyczyną najczęściej są notoryczne problemy plików .class javy ze ścieżkami, a dokładniej z pakietami i ich przełożeniem na rzeczywiste położenie w lokalnym systemie plików. Warto czasem zapytać aplet o swoje położenie domyślne, co można zrobić za pomocą: obiektApletu.getClass().getResource(".")

Przykład powiązania umiejscowienia pakietu z osadzeniem apletu na stronie html:

package org.terrorist.nuclear; //pakiet określa ścieżkę, której można użyć w applet code
//...
import javax.swing.JApplet;
import javax.swing.JPanel;
//...
class MeltdownWorm extends JApplet
{
/*...*/
}

Kod aplet jest osadzany przez javę na ścieżce względnej. Dlatego jeżeli "applet code" przydzieli się samą nazwę klasy apletu, to domyślnie sam aplet nie powinien znajdować się w jakimkolwiek pakiecie (klasa nie powinna zawierać instrukcji package). Ponieważ nie jest to na dłuższą metę do utrzymania, więc trzeba uzgadniać ścieżkę taką jaką wyprodukuje kompilator java w wywołaniu apletu. Jeżeli zagnieżdżenie pakietów będzie głębsze, to trzeba to uwzględniać tak jak w tym przykładzie:

<html>
	<head><title>الله أكبر</title></head>
	<body>
	<applet code="org/terrorist/nuclear/MeltdownWorm.class" width="100%" height="100%">
		<param name="start" value="24.12.2010">
		Get Stuxnet frontend updated version.
	</applet>
	</body>
</html>
[...]

W przypadku umieszczenia klasy w archiwum jar, to powinien on zawierać już taką ścieżkę jaka odpowiadałaby użyciu w "applet code". I po rozpakowaniu przez przeglądarkę plik .class znalazłby się tam gdzie jest oczekiwany.

0

Ok, poradziłem sobie.
Dziękuję za pomoc.

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