Java w przeglądarce

Poznaliśmy już sposób tworzenia aplikacji uruchamianych za pomocą okna konsoli oraz korzystających z GUI, czas więc poznać charakterystyczny wyróżnik Javy - aplet. Jako przykład posłuży nam program wyświetlający na stronie internetowej aktualną datę i czas.

Poznaliśmy już sposób tworzenia aplikacji uruchamianych za pomocą okna konsoli oraz korzystających z GUI, czas więc poznać charakterystyczny wyróżnik Javy - aplet. Jako przykład posłuży nam program wyświetlający na stronie internetowej aktualną datę i czas.

Aplet to program napisany w języku Java, po skompilowaniu umieszczany na serwerze (w postaci kodu pośredniego), a następnie za pośrednictwem strony internetowej uruchamiany w przeglądarce na komputerze lokalnym.

Podstawowe różnice między autonomicznym programem a apletem to zaimplementowanie klasy dziedziczącej z klasy JApplet, która znajduje się w pakiecie javax .swing oraz brak metody main(). Zamiast głównej metody musi być zaimplementowana metoda init(), należąca do klasy JApplet, która jest wykonywana tylko raz, zaraz po załadowaniu strony WWW zawierającej aplet. Metoda ta jest odpowiednikiem konstruktora klasy. Oczywiście są jeszcze inne metody charakterystyczne dla apletu, np.:

  • start() - po raz pierwszy wykonywana zaraz po wywołaniu metody init(), a potem w czasie każdego powrotu do strony z apletem;
  • stop() - wykonywana po każdym opuszczeniu strony WWW z apletem;
  • destroy() - wykonywana tylko raz, gdy aplet kończy działanie - do zwolnienia używanych zasobów.
Te metody stosowane są na przykład wówczas, gdy aplety odtwarzają animacje lub dźwięki obciążające system operacyjny. Pozwala to zwalniać zasoby podczas opuszczania strony z apletem i ponownie je przywracać przy powrocie do tej strony.

Pamiętajmy, że metody init() oraz destroy() są wywoływane tylko raz, natomiast metody start() oraz stop() mogą być wywoływane wiele razy.

Zajmiemy się przede wszystkim metodą init():

//importowanie pakietu zawierającego klasę JApplet

import javax.swing.*;

//implementacja głównej klasy

//rozszerzającej klasę JApplet

public class Data extends JApplet {

//implementacja głównej metody apletu - init()

public void init() {

...

}

}

Własny pakiet

Dotychczas kod źródłowy naszych programów był zawarty w jednym pliku, a klasy korzystały z gotowych już bibliotek Javy z pakietu SDK. Jednak nie zawsze jest to korzystne rozwiązanie. Często duże aplikacje wymagają podziału kodu źródłowego na mniejsze pliki. Te z kolei, zorganizowane w postaci struktury katalogów, mogą stanowić własną bibliotekę, służącą nawet kilku aplikacjom. Program, choć niewielki, zostanie właśnie w taki sposób skonstruowany. Podzielimy go na dwie podstawowe części: klasę główną Data.java, znajdującą się w bieżącym katalogu, oraz własną bibliotekę, z której klasa główna będzie korzystać. Naszą bibliotekę stanowi jeden pakiet. Jest to katalog moj_pakiet, w którym znajduje się podkatalog panel, w którym z kolei umieszczona zostanie utworzona przez nas klasa PanelApletu.java.

Aby jednak klasa główna Data mogła korzystać z klasy PanelApletu, musimy tę ostatnią zaimportować. Do pliku Data.java trzeba dodać następującą instrukcję:

//importowanie pakietu zawierającego

//klasę PanelApletu

import moj_pakiet.panel.*;

Oczywiście nie ma znaczenia, czy dodatkową dyrektywę import umieścimy przed, czy po poleceniach zaimportowania standardowych pakietów Javy. Ważne jedynie, aby wszystkie pakiety były dołączone do programu przed implementacją klas.

Jednak to nie wystarczy. Trzeba jeszcze określić przynależność pliku PanelApletu.java do nowo utworzonego pakietu. W pliku PanelApletu.java - jeszcze przed implementacją klas i dyrektywą import - umieszczamy zatem dyrektywę package, określającą katalogi, w których plik ten się znajduje:

package moj_pakiet.panel;

Budowa tej dyrektywy jest podobna do import, ale wskazujemy w niej jedynie strukturę katalogów, pomijając nazwę pliku lub gwiazdkę. Teraz możemy przystąpić do kompilacji programu. Wywołując program javac, podajemy tylko nazwę pliku głównej klasy:

javac Data.java

Oprócz pliku Dane.java, kompilator odnajdzie również pliki zawarte w katalogach pakietu i zamieni je na kod pośredni. Jednak w naszym przykładzie klasa Dane importuje, co prawda, pakiet moj_pakiet.panel, ale z niego nie korzysta, ponieważ zarówno klasa Dane, jak i klasa PanelApletu są jeszcze puste. Dopiero wypełnimy je treścią. Na razie zostanie skompilowany jedynie plik Dane.java.

Teraz możemy przystąpić do implementacji klasy PanelApletu. Aby dało się ją zaimportować, musi być poprzedzona modyfikatorem public - podobnie jak klasa główna apletu. Dotyczy to również konstruktora tej klasy. Klasa PanelApletu tworzy panel, który potem dołączymy do powierzchni zawartości apletu.

Własna klasa w pakiecie

Rysunek 2. BorderLayout - układ krawędziowy komponentów.

Rysunek 2. BorderLayout - układ krawędziowy komponentów.

Aplet jest kontenerem mogącym przechowywać inne kontenery lub komponenty, bo klasa ta dziedziczy pośrednio z klasy Container, pochodzącej z kolei od klasy Component. Podobnie jak w przypadku kontenera typu JFrame, który wykorzystywaliśmy w poprzedniej części kursu Javy do utworzenia okna aplikacji, tak i tu najpierw powinniśmy za pomocą metody getContentPane() pobrać powierzchnię zawartości apletu i dopiero za pośrednictwem znanej już nam metody add() dodać do niej panel, żeby następnie do panelu dodawać komponenty. W tym celu w pliku PanelApletu.java dokonamy implementacji klasy rozszerzającej klasę JPanel:

package moj_pakiet.panel;

import java.awt.*;

import javax.swing.*;

import javax.swing.border.*;

public class ApletPanel extends JPanel {

public ApletPanel() {

Color tlo = new Color(204,255,204);

setBackground(tlo);

setLayout(new BorderLayout());

Border podniesiona = BorderFactory.createRaisedBevelBorder();

Border obnizona = BorderFactory.createLoweredBevelBorder();

Border pusta = BorderFactory.createEmptyBorder(3,3,3,3);

Border zew = BorderFactory.createCompoundBorder(podniesiona,pusta);

Border wew = BorderFactory.createCompoundBorder(obnizona,pusta);

Border krawedz = BorderFactory.createCompoundBorder(zew,wew);

setBorder(krawedz);

}

}

W konstruktorze klasy PanelApletu określiliśmy kolor tła panelu. Posłużyła do tego metoda setBackground(), zaimplementowana w klasie JComponent, z której dziedziczy klasa JPanel. Metoda ta pobiera obiekt typu Color.

Najpierw tworzymy obiekt typu Color, przekazując do konstruktora klasy Color wartości RGB określające kolor w postaci trzech liczb całkowitych, odpowiadających kolejno kolorom: czerwonemu, zielonemu i niebieskiemu. Każda z liczb całkowitych może przyjmować wartości z zakresu 0-255. Podany przez nas kolor to jasna zieleń. Obiekt ten przypisany został do zmiennej referencyjnej tlo, którą z kolei przekazaliśmy jako parametr metody setBackground().


Zobacz również