Java 1 - Wydział Matematyki i Informatyki UŁ

advertisement
Uniwersytet Łódzki
Wydział Matematyki i Informatyki,
Katedra Analizy Nieliniowej
Dziedziczenie, AWT
Java
Wykład 4
mgr inż. Michał Misiak
Plan wykładu
Java Web Start
 Dziedziczenie (Inheritance)
 Interfejsy, klasy abstrakcyjne
 Polimorfizm
 AWT
 Layout Manager

Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Java Web Start

Uruchamianie aplikacji Javy z pełną funkcjonalnością za pomocą jednego
kliknięcia






(http://java.sun.com/docs/books/tutorialJWS/deployment/webstart/examples/Note
pad.jnlp)
Pobieranie i uruchamianie aplikacji bez konieczności jakiejkolwiek instalacji
dla różnych platform
W przypadku, gdy aplikacja korzysta z innej wirtualnej maszyny niż
dostępna lokalnie, maszyna ta zostanie pobrana i uruchomiona
automatycznie
Użytkownik może uruchomić aplikację poza przeglądarką. Aplikacja jest
zapisana w pamięci podręcznej Java Web Start.
Aplikacje z niezaufanych źródeł mogą być uruchamiane w bezpieczny
sposób, ze względu na możliwość zdefiniowania restrykcji np. standardowo
aplikacje nie mogą zapisywać danych lokalnie na dysku.
Zapisanie aplikacji lokalnie w pamięci podręcznej gwarantuje zwiększenie
wydajności
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Java Web Start (2)

Aplikacje przechowywane w pamięci
podręcznej JWS można podejrzeć za
pomocą Java Cach Viewer


control panel\java\general,view
Przygotowanie aplikacji Java Web
Start


Rozszerzenie typów MIME
obsługiwanych przez serwer o:
application/x-java-jnlp-file
Utworzenie pliku JNLP jako XML z
określeniem wybranych tagów



opis tagów:
http://java.sun.com/docs/books/tutorial/
deployment/webstart/deploying.html
Umieszczenie aplikacji w postaci JAR
oraz pliku JNLP na serwerze
Dostęp do elementów aplikacji (res) z
wykorzystaniem funkcji getResource()
<?xml version="1.0" encoding="utf-8"?>
<!-- JNLP File for Notepad -->
<jnlp spec="1.0+”
codebase="http://java.sun.com/docs/books/tutorialJWS
/deployment/webstart/examples/"href="Notepad.jnlp”>
<information>
<title>Notepad Demo</title>
<vendor>The Java(tm) Tutorial: Sun Microsystems,
Inc.</vendor>
<description>Notepad Demo</description>
<homepage
href="http://java.sun.com/docs/books/tutorial/deploy
ment/webstart/running.html"/>
<description kind="short">ClickMeApp uses 3 custom
classes plus several
standard ones</description>
<offline-allowed/>
</information>
<resources>
<jar href="Notepad.jar"/>
<j2se version="1.6+”
href="http://java.sun.com/products/autodl/j2se"/>
</resources>
<application-desc main-class="Notepad"/>
</jnlp>
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Java Web Start (3)


Aplikacje Java Web Start
domyślnie uważane są za
niezaufane (untrusted)
Standardowe ograniczenia dla
aplikacji JWS
Brak dostępu do dysku lokalnego
Pobieranie wszystkich JAR z tego
samego serwera
 Aplikacja może realizować
połączenia wyłączenie do
serwera, z którego zostały
pobrane pliki JAR
 Security Manager nie może być
usunięty lub zamieniony
 Nie można używać bibliotek
natywnych




JNLP API: javax.jnlp
Bezpieczeństwo Java Web Start:

Aplikacje wykonywane w
wydzielonym środowisku
(sandbox)
 Aplikacje podpisane – mogą mieć
szersze uprawnienia w lokalnym
systemie. Sprawdzana jest
integralność, niezaprzeczalność
autentyczność
 Ustawienie poziomu
bezpieczeństwa w pliku jnlp:
<security><all-permissions/></security>
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Dziedziczenie
FIGURA








Dziedziczenie jest to mechanizm
paradygmatu programowania obiektowego
Przejmowanie stanu (pola) oraz zachowań
(metody) obiektu z którego się dziedziczy
Tworzenie kategorii (generalization): Klasa
bazowa stanowi kategorię (rodzinę typów)
na bazie której mogą być tworzone inne typy
Nadpisywanie (overriding): zmienianie
znaczenia zachowania się typu, z którego
dziedziczmy
Ponowne wykorzystanie kodu (co-reuse), w
innych typach.
Dziedziczone są wszystkie elementy klasy
nadrzędnej z wyjątkiem konstruktorów.
Konstruktor klasy bazowej mogą być wołane
z klasy, która dziedziczy.
Odwołanie do członków klasy bazowej po
przez „super”. Wołanie konstruktora klasy
bazowej: super();
Dwa określenia: klasa bazowa (super klasa,
nadklas) i klasa potomna (podrzędna,
podklasa)
Pole
Obwód
Pole
x
Pole
obwód
Obwód promień
Obwód y
Prostokąt
Koło
Pole
…
Obwód …
…
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Jednokrotne dziedziczenie



W Javie można stosować
wyłącznie jednokrotne
dziedziczenie.
Dziedziczenie wielokrotne
może powodować nieścisłość
– wymagana jest dyscyplina
programisty oraz precyzyjna
znajomość mechanizmów
języka.
Zachowanie polimorficzne
możliwe do ociągnięcia po
przez zastosowanie
interfejsów.

Co można robić na poziomie podklasy:








Dziedziczone pola mogą być używane
bezpośrednio w podklasie
Można deklarować zmienne w podklasie o
nazwach takich jak w klasie bazowej.
Niezalecane.
Możliwość deklaracji pól w klasie podrzędnej,
które nie są w klasie bazowej.
Odziedziczone metody mogą być
wykorzystywane w klasie podrzędnej
bezpośrednio.
Możliwość nadpisywania metod z klasy
nadrzędnej po przez identyczną deklarację.
Możliwość deklaracji metody statycznej w
klasie podrzędnej, która przykryje metodę z
klasy nadrzędnej
Możliwość deklaracji nowych metod w
podklasie.
Możliwość napisania konstruktora w
podklasie, który wywoła konstruktor klasy
bazowej.
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
typ Object – jako przykład klasy
bazowej


Klasa Object znajduje się na samej górze hierarchii dziedziczenia. Wszystkie obiekty
dziedziczą po Object.
Klasa Object udostępnia zbiór metod, które powinny w miarę potrzeby zostać
przeładowane w tworzonych klasach. Jest ich ok. 50. Przykłady:

protected Object clone() throws CloneNotSupportedException


public boolean equals(Object obj)


zawraca nazwę klasy.
public int hashCode()


wołana w przypadku, gdy obiekt jest niszczony przez Garbage Collector.
public final Class getClass()


wykorzystywana do porównania dwóch obiektów. W podstawowej implementacji tej metody użyto
operatora „==„, który daje poprawne wyniki raczej dla typów prymitywnych (porównanie wyłącznie
referencji, tzn. czy to ten sam obiekt). Dlatego znając specyfikę klasy należy przeładować tą metodę.
protected void finalize() throws Throwable


Implementuje interfejs Clonable.
zwraca adres w pamięci w postaci heksadecymalnej.
public String toString()
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Delegacja



Wykonanie zadania przez jakąś metodę jest
wykonywane przez inną metodą – jest do tej
drugiej metody delegowane przez pierwszą
metodę.
Mechanizm używany w celu ułatwienia
zarządzania kodem – wielokrotnego
wykorzystania kodu.
W Javie jest to niepełny mechanizm. W C#
sprytnie zastosowany do obsługi zdarzeń.
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Modyfikatory i rzutowanie obiektów



Podklasa nie dziedziczy
elementów klasy bazowej z
modyfikatorem private
W przypadku dziedziczenia z
klasy, która posiada klasę
zagnieżdżoną, ta klasa
zagnieżdżona ma dostęp do pól
private klasy bazowej, w której jest
zagnieżdżona a tym samym
podklasa ma niebezpośredni
dostęp do pól private klasy
bazowej.
Należy strać się stosować
możliwe najbardziej restrykcyjny
modyfikator dostępu.


Możliwość rzutowania obiektu klasy
podrzędnej na typ obiektu klasy
bazowej;
Możliwość wymuszonego rzutowania
np.:



Rower rower = new Rower();
Object obj = new Rower();
Rower newRower = obj;



(BŁĄD) – kompilator nie wie do jakiego
typu został przypisany błąd. Jeśli obj nie
jest typu Rower zostanie rzucony
wyjątek.
Rower newRower = (Rower) obj;
W celu zabezpieczenia się przed
błędnym rzutowaniem można wykonać
następujący test logiczny:
if (obj instanceof Rower) {
Rower myBike = (Rower)obj;
}
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Tablica modyfikatorów – zakres
widoczności
Modyfikator
Class
Rozwiązanie Przykładu.
Public
Tak
Modyfikator
a
Protected
Tak
Public
Tak
Bez mod.*)
Tak
Protected
Tak
Private
Tak
Bez mod.*)
Tak
Package
Subclass
Poza
Tak
b
Tak
Tak
Tak
Tak
Nie
Tak
Tak
subb
Tak
Tak
Nie
Tak
Nie
Nie
Tak
c
Nie
Tak
Nie
Nie
Nie
Nie
*) Bez modyfikatora – jest to tzw. widoczność publiczna, ale wyłącznie ramach pakietu.
Nie
Nie
Nie
Są Private
to tzw. packag-private. Tak
PakietA
PakietB
Przykład: Określić widoczność
elementów klasy a po przez pozostałe
klasy (b, subb, c)
a
subb
b
c
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Nadpisywanie i ukrywanie metod





Metoda Instancji z taką samą sygnaturą
(nazwa oraz lista parametrów) oraz z tym
samym zwracanym typem nadpisuje
(override) metodę z klasy bazowej
Nadpisywanie pozwala korzystać z typów,
które są dla nas prawie wystarczające
natomiast częściowo chcemy zmienić ich
zachowanie
Przeładowana metoda może zwrócić typ,
który jest podtypem metody, która została
przeładowana
Możliwość wykorzystania tagu @override w
JavaDoc
Metoda, która przeładowuje daną metodą
może używać jedynie modyfikatorów
silniejszych. Np. protected jeśli była public i
priavte jeśli była public




Metoda klasy (Class Method) z taką
samą sygnaturą (nazwa oraz lista
parametrów) oraz z tym samym
zwracanym typem przykrywa (hide)
metodę klasy bazowej
Wersja metoda przykrytej, która
faktycznie zostanie wywołana zależy
od tego czy wołamy na klasie bazowej
czy podklasie.
Przykład dla metody klasy
Natomiast w przypadku wystąpienia w
podklasie pól o takich samych
nazwach jak w klasie bazowej
następuje ich przykrycie przez pola z
podklasy. Odwołanie do tych pól
możliwe jedynie przez „super”
Uwaga! Jeśli nie chcemy, aby dana metoda została nadpisana należy ją zadeklarować z
modyfikatorem final. Wiele metod z Object jest final.
Również jeśli nie chcemy, aby dana klasa była rozszerzana stosujemy final. Przydatne w sytuacji, gdy
implementujemy typy niemutowalne np.. String.
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Polimorfizm


Mechanizm paradygmatu
programowania obiektowego
Polimorfizm pozwala wirtualnej
maszynie na określenie w
trakcie wykonywania
programu, która wersja metody
powinna zostać wywołana. W
trakcie kompilacji nie można
stwierdzić jaką referencję
będzie przechowywała
zmienna typu computer
computer
toString()
toString()
toString()
notebook
workstation
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Interfejsy







Abstrakcyjny typ pozwalający na specyfikację
interfejsów
Obiekty definiują sposób zachowania po przez
metody jakie eksponują – określają tym samym
swój interfejs.
Wykorzystanie w klasie interfejsu wymaga
implementacji wszystkich jego metod, chyba, że
klasa jest klasą abstrakcyjną
Interfejs deklaruje się za pomocą słowa kluczowego
interface
Interfejsy mogą zawierać jedynie metody oraz pola
statyczne (definiowane jako static lub final).
Można pominąć te modyfikaotry.
Zastosowanie interfejsu w danej klasie oznaczane
jest za pomocą słowa implements
Pozwala na użycie obiektu, bez koniczności
znajomości jego typu np. przy sortowaniu – nie
musimy wiedzieć dokładnie jaki typ obiektu będzie
sortowany.
[modyfikator] interface InterfaceName
[extends inne interfejsy] {
//deklaracje stalych
// deklaracje metod abstrakcyjnych
}
Przykład:
public interface Zwierze {
void jedz(jedzenie j);
}
public class Kot implements Zwierze {
public boolean chasePrey(Prey p) {
// programming to chase prey p
}
public void eatPrey (Prey p) {
// programming to eat prey p
}
}
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Interfejsy (2)





Interfejsy wykorzystywane do realizowania mechanizmu callback.
Oczywiście interfejs może rozszerzać inne interfejsy.
Interfejs może w przeciwieństwie do klas rozszerzać więcej niż
jeden interfejs.
Interfejs, który nie jest wyspecyfikowany jako public widoczny jest
jedynie dla klas w tym samym pakiecie. Mają zastosowanie zasady
widoczności dla modyfikatorów przy dziedziczeniu klas.
Zalecenie! W przypadku rozszerzenia danego interfejsu o jakąś
metodę należy stworzyć nowy interfejs udostępniający zakładaną
funkcjonalność. Dodanie do uprzedniego interfejsu spowoduje
wygenerowanie błędu w klasach, które go implementują.
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Klasy abstrakcyjne






Klasa abstrakcyjna, to klasa
zadeklarowana z modyfikatorem
abstract
Nie może być instancją natomiast
może być dziedziczona
Może ale nie musi zawierać metod
abstrakcyjnych
Natomiast klasa, która posiada metody
abstrakcyjne musi być zadeklarowana
jaka abstract
Metoda abstrakcyjna to metoda, która
nie ma ciała
Klasa, która dziedziczy z klasy
abstrakcyjnej musi implementować
wszystkie metody klasy abstrakcyjnej
lub być zadeklarowana jako abstract.
//Przykład metody abstrakcyjnej
abstract void doSomething(double zm1,
double zm2);
//przykład klasy
public abstract class klasaAbstrakcyjna {
//deklaracja pól
int zm1;
int zm2;
//deklarcja metod nieabstrakcyjnych
public int suma(int x, int y){
return x+y;
}
//deklaracja metod abstrakcyjnych
public abstract int roznica(int x,
int y);
}
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Interfejs vs klasy abstrakcyjne,
przykład …




W klasie abstrakcyjnej w przeciwieństwie do
interfejsów mogą być pola non-static oraz
mogą być implementacje metod.
Klasy abstrakcyjne mogą być
wykorzystywane do koncepcji
współdzielenia kodu.
Obiekty graficzne posiadają pewien
podobny zbiór stanów oraz zachowań
Zamodelowanie w postaci hierarchii
dziedziczenia z klasy abstrakcyjnej:



stan np. pola: aktualnaPozycja
zachowanie np. metody: przesunDo(),
odrysuj(), zmienRozmiar()
Obiekt graficzny
Koło
Prostokąt
linia
krzywa
Klasa abstrakcyjna może dziedziczyć
niepełne zachowanie po interfejsie, tym
samym nie musi implementować wszystkich
metod interfejsu. Natomiast klasa, która
dziedziczy po klasie abstrakcyjnej musi
implementować pozostałe metody.
Przykład: http://www.developer.com/java/article.php/803891
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Wprowadzenie do AWT



AWT – Abstract Window Toolkit, wykorzystywany
do budowy graficznych interfejsów
AWT do obsługi elementów interfejsu
użytkownika wykorzystuje natywne GUI. Wygląd
GUI w tym przypadku jest analogiczny do GUI
systemu operacyjnego, na którym uruchamiana
jest aplikacja.
Jest to tzw. ciężki typ kontrolek, gdyż wołane są
odpowiednie funkcje systemowe
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Graphical User Interfece





GUI zbudowane jest z elementów graficznych nazywanych
komponentami. Komponentami są np. przyciski, pola tekstowe,
paski, etc…
Klasą bazową dla wszystkich typów komponentów graficznych jest
Component -> patrz hierarchia dziedziczenia
Komponenty znajdują się w kontenerach. Kontenery zarządzają
rozkładem komponentów, w których się znajdują.
Kontenery są również komponentami i tym samym mogą być
umieszczane w innych kontenerach.
Kontenery są instancją klasy Container lub jej podklas
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Odświeżanie komponentów graficznych

Powodowane przez system


Komponent graficzny powinien
zostać narysowany po raz
pierwszy
 Komponent zmienił rozmiar
 Zawartość komponentu
została przysłonięta

Powodowane przez aplikację

Aplikacja uznaje, że jej stan
wewnętrzny wymaga
przemalowania komponentu
Powodowane przez system


Z wątku obsługi zdarzeń
zostanie wywołana metoda
paint()
Powodowane przez aplikację
Aplikacja woła repaint()
 Z wątku obsługi zdarzeń
zostanie wywołana metoda
update() (scalanie wywołań !)
 Standardowa realizacja
update() najpierw wypełni tło
aktualnym kolorem tła
komponentu, następnie
wywoła metodę paint()

Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Metoda paint()





Programista dostarcza implementację metody, tego co
de facto chce narysować
Należy przeładować metodę:
public void paint(Graphics g)
Graphics przedstawia kontekst graficzny, dla którego
można ustawić: kolor, czcionkę, współrzędne, region
obcinania
Kod związany z rysowaniem powinien być umieszczany
w tylko w ciele metody paint() lub metodach przez nią
wołanych.
Przykład metody paint()
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Klasa Komponent – wybrane
metody (1)


getBackground/setBackground
getForeground/setForeground



getFont/setFont



Zmiana domyślnego koloru przedniego planu
Kolor jest dziedziczony przez obiekt Graphics dla komponentu
Ustawia/zwraca aktualny kolor czcionki
Kolor jest dziedziczony przez obiekt Graphics dla komponentu
paint

Wołana za każdym razem, kiedy użytkownik wywołuje metodę
repaint lub następuje zmiana komponentu (przesunięcie
okienka, przesłonięcie, etc …)
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Klasa Komponent – wybrane
metody (2)

setVisible

eksponuje lub ukrywa komponenty
 szczególnie użyteczne dla ramek i okienek dialogowych


setSize/setBounds/setLocation
getSize/getBounds/getLocation


list


wyświetla informacje na temat komponentu. Zawiera użyteczne
informacje do debugowania.
invalidate/validate


ustawia fizyczne aspekty komponentu: rozmiar oraz pozycję
wskazuje menadżerowi rozkładu, żeby przywrócić poprzedni
getParent

zwraca okno, w którym jest zamknięty lub null
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Lightweight components




Lekkie komponenty dziedziczą bezpośrednio z
klasy Component, nie z natywnych
dostarczanych przez system (tzw. peer).
Implementują bezpośrednio look’n’feel, rzadziej
delegując go do systemu.
Lekkie komponenty efektywniej gospodarują
zasobami. Mogą być przeźroczyste i nie muszą
być prostokątami.
Przykładami zbioru lekkich komponentów jest
Swing.
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Klasa Canvas



Jest to miejsce, w
którym można rysować
Płótno nie ma żadnego
menadżera rozkładu,
nie może zawierać
innych komponentów
Dziedziczy się z Canvas
i przeładowuje funkcję
paint() w celu tworzenia
własnego komponentu.
Np. do tworzenia
obrazkowego przycisku

Wymiarowanie Płótna:


Dodawania Płótna do aktualnego okna:


add(plotno)
lub dodawanie do okna z LayoutManager


setSize(wysokosc, szerokosc)
add(canvas,
BorderLayout.Region_Name);
Malowanie zawartości. Przeładowanie metody
Pain

public void paint(Graphics g) {
setBackground(Color.LIGHT_GRAY);
//odrysowanie prostokąta
g.drawRect(0, 0, 99, 49);
//odrysowanie ciągu znaków
g.drawString(„Płótno", 20,20);
}
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Klasa Panel

Główne przyczyny



Domyślnym menadżerem rozkładu jest FlowLayout



W celu grupowania komponentów
Komponenty użytkownika, które wymagają zagnieżdżenia – A
custom component that requires embedded components
Ogranicza komponenty do ich preferowanych rozmiarów
(minimalnych)
Komponenty zostają w nim umieszczone od lewej do prawej
Tworzenie i korzystanie z panelu:


Tworzenie panelu: Panel panel = new Panel();
Dodawanie komponentów do Panelu:
panel.add(someComponent);…
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Klasa Panel (2)

Dodanie Panelu do Kontenera:




Ażeby dodać panel do zewnętrznego kontenera:
container.add(panel);
Ażeby dodać panel do istniejącego kontenera: add(panel);
Dodawanie panelu do kontenera z rozkładem BorderLayout:
container.add(panel,region);
W klasie Panel brakuje eksplicite funkcji wymiarującej
rozmiar Panelu. Rozmiar Panelu determinują
komponenty. Panel, który nie przechowuje komponentów
ma rozmiar 0.
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Klasa Container



Przodek dla wszystkich rodzajów okien z wyjątkiem Canvas
Dziedziczy wszystkie metody komponentu
Użyteczne metody dla Container

add



remove


Usuwa komponent z okna (kontenera)
getComponents



Dodanie komponentu do kontenera.
Jeśli użyty jest BorderLayout, można określić, w którym miejscu umieścić
komponent
Zwraca tablicę komponentów w danym oknie
Używany przez menadżera rozkładów
setLayout

Zmienia menadżera rozkładu skojarzone z danym oknem
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Klasa Frame

Główny cel





Domyślny LayoutManager: BorderLayout
Przełączenie Manager’a: setLayout(new FlowLayout());
Tworzenie i używanie dwóch rodzajów okien:



Aplikacje tzw. stand-alone z własnym paskiem menu i paskiem
tytułu, obramowaniem, kursorem oraz ikoną
Może zawierać inne komponenty GUI
Ze stałym rozmiarem
Dopasowujących się do tego co zawierają (metoda pack())
Uwaga! Dziwne zachowanie ramki, w przypadku, gdy się
do niej doda komponent, po wywołaniu metody visible
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Zamykana ramka
import java.awt.*;
import java.awt.event.*;
public class CloseableFrame extends Frame {
public CloseableFrame(String title) {
super(title);
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
}
public void processWindowEvent(WindowEvent event) {
super.processWindowEvent(event); // Handle listeners
if (event.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
}
}
Uwaga! W przypadku apletu zamiast funkcji System.exit należy użyć dispose()
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Klasa Dialog

Cele użycia




Uproszona ramka. Brak możliwości określenia kursora, ikony,
paska menu, etc…
Okienko Dialog zamraża interakcję z innymi komponentami AWT
do momentu jego zamknięcia
Standardowy LayoutManager: BorderLayout
Tworzenie i używanie:

Podobnie do ramki, jednakże konstruktor bierze dwa dodatkowe
argumenty: ramkę z której jest wołany oraz wartość logiczną
określającą czy jest modalny czy nie.


Dialog dialog = new Dialog(parentFrame, titleString, false);
Dialog modalDialog = new Dialog(parentFrame, titleString, true);
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
java.awt oraz hierarchia
dziedziczenia
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Budowa interfejsu graficznego


Każdy interfejs
można
zaprezentować w
postaci drzewa,
którego korzeniem
jest Container, a
liśćmi są
komponenty
(przyciski, pola
tekstowe, etc…)
Przykład ->
następny slajd

Typy kontenerów:
Window – najwyższa warstwa w GUI (okno).
Window nie jest podłączany do żadnego innego
kontenera. Instancja obiektu Window nie ma
krawędzi, ani tytułu.
 Frame – najwyższa warstwa w GUI (okno), która
posiada tytuł oraz krawędź. Instancja Frame może
posiadać pasek menu (menubar)
 Dialog – najwyższa warstwa w GUI z krawędzią i
tytułem. Instancja Dialog nie może istnieć bez
skojarzenia z konkretną instancją Frame.
 Panel – generyczna postać kontenera, który może
przechowywać komponenty. Instancja Panel
oferuje kontener, do którego mogą być dodawane
komponenty.

Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Kontrolki GUI - AWT





Automatycznie rysowane, nie potrzeba przeładowywać
metody paint.
Pozycjonowane są przez menadżera rozkładów.
Używają natywnych okienek systemowych tzw. widgets.
Adoptują look ‘n’ feel systemu, na którym są
uruchamiane.
Typowo używane zdarzenia wysokopoziomowe:


Przykład: dla przycisków nie potrzeba monitorować kliknięć
myszki, dodatkowo system operacyjny wyzwala przycisk w
momencie uderzenia „ENTER” na klawiaturze, kiedy dany
przycisk jest w fokusie.
Szczegóły obsługi zdarzeń na następnym wykładzie.
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Reprezentacja GUI w postaci
drzewa komponentów
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007
Download