Programowanie obiektowe - JAVA
Informacje ogólne > Laboratorium 2 > Ćwiczenie 2

Ćwiczenie 2

TWORZENIE OKNA - C.D.

1. Utworzyć nowy projekt Java w Eclipse.

2. Przy pomocy konstruktora utworzyć klasę o nazwie Okno, ustawiając tak parametry konstruktora, aby nowa klasa:

  • dziedziczyła po klasie Frame (kliknąć Browse obok pola Superclass i wpisać Frame...)
  • zawierała metodę main() (zaznaczyć odpowiednią opcję)
  • zawierała definicje konstruktorów z klasy Frame (zaznaczyć constructors from superclass)

3. Poprawnie utworzona przez konstruktor klasa powinna wyglądać tak: (PROSZĘ NIE KOPIOWAĆ TEGO KODU, ALE SAMEMU SKORZYSTAĆ Z KONSTRUKTORA KLAS ECLIPSE!)

import java.awt.Frame;
import java.awt.GraphicsConfiguration;
import java.awt.HeadlessException;

public class Okno extends Frame {

   public Okno() throws HeadlessException {
   }

   public Okno(GraphicsConfiguration arg0) {
     super(arg0);
   }

   public Okno(String arg0) throws HeadlessException {
     super(arg0);
   }

   public Okno(String arg0, GraphicsConfiguration arg1) {
     super(arg0, arg1);
   }

   public static void main(String[] args) {
   }

}


4. Jak widać utworzona nowa klasa posiada oprócz metody main() również cztery dodatkowe elementy - wszystkie o nazwie Okno(), ale pobierające różne argumenty. Są to definicje konstruktorów odziedziczone z klasy Frame.

Słowo "super" widoczne wewnątrz konstruktorów używa się aby wywołać konstruktor klasy nadrzędnej (w naszym wypadku Frame). Stosuje się go na początku konstruktora, po czym można dodać dalszy kod, który sprawi, że klasa Okno będzie rozszerzeniem klasy Frame.

5. Zmodyfikować konstruktor Okno() (bezargumentowy - pozostałe trzy można usunąć) tak, aby zawierał:

  super(); // wywołanie konstruktora klasy nadrzędnej - w tym przypadku równoważne z Frame();
  setBounds(10,10,200,200); // ustawianie granic okna - można również użyć innych metod, np. setLocation, setSize
  setVisible(true); // ustawianie okna "widocznym"

6. Wewnątrz metody main utworzyć nowy obiekt klasy Okno i uruchomić program. Porównanie kodu programu z tym ćwiczenia 1 powinno pozwolić na zrozumienie podstawowej idei dziedziczenia.

7. Zmodyfikować program tak, aby klasa Okno implementowała interfejs WindowListener:
zmodyfikować deklarację klasy:
   public class Okno extends Frame
dodając extends i nazwę interfejsu:
   public class Okno extends Frame implements WindowListener

Eclipse przy tej w linii kodu pokaże ikonę błędu. Klikając na nią należy kolejno: zaimportować interferjs oraz dodać niezaimplementowane metody.

Po dodaniu niezaimplementowanych metod interfejsu WindowListener w kodzie powinno pojawić się siedem nowych metod, z których każda przechwytuje wszelkie zdażenia jakie może wygenerować okno.
Aby po kliknieciu [X] program kończył działanie wewnątrz metody windowClosing() wpisać:
     System.exit(0);

8. Sama implementacja interfejsu nie wystarcza, aby okno utworzone przy pomocy konstruktora Okno() poprawnie się zamykało. Należy jeszcze dodać interjes do konkretnego obiektu. W naszym przypadku wystarczy w konstruktorze dopisać następujący kod:
   this.addWindowListener(this);
Po uruchomeniu programu okno powinno się zamykać.

WAŻNA UWAGA!
Słowo
this jest używane jako wskazanie na ten obiekt wewnątrz którego zostało użyte. Zapis:
   this.addWindowListener(this);
można rozumieć jako "do TEGO obiektu dodaj obsługę interfejsu WindowListener, a metody obsługujące generowane zdarzenia znajdują się w TEJ klasie". Może się to wydawać na pierwszy rzut oka nieco zawiłe, ale w taki sposów w Javie dodaje się wszelkie interfejsy: najpierw podaje się wskaźnik na obiekt, do którego ma zostać dodany interfejs, później używa się metodę dodającą określony interfejs, a jako argument do metody przekazuje się obiekt (klasę) posiadający implementację danego interfejsu. Ogólnie mozna to zapisać jako:
obiekt_do_którego_dodawany_jest_interfejs.addNazwaInterfejsu( obiekt_implementujący_dany_interfejs);

Kolejna uwaga: 
W naszym przypadku wystarczyłoby również wpisanie kodu w postaci:
   addWindowListener(this); 
ponieważ wszystkie metody bez podanego "źródła" Java traktuje jako odwołujące się do tej klasy wewnątrz której są używane. Pomijanie słówka this jest w tym przypadku poprawne z formalnego punktu widzenia ("czystość kodu"). Jednak użycie tego słowa czasem ułatwia pisanie programu: przykładowo pisząc wewnątrz konstruktora Okno() po wpisaniu this. po kropce Eclipse wyświetli wszystkie dostępne metody (odziedziczone po klasie macierzystej Frame oraz ewentualnie inne dopisane ręcznie).