Nie możemy dalej iść z biblioteką "Swing" dopóki nie zapoznamy się ze sposobami "podpinania" zdarzeń. Istnieją dwie metody: starsza istniejąca od Javy 5.0 (2004) i nowsza od Javy 8 (2014). Pokażę Wam obie i podzielę to na dwie części. Najpierw struktura sama w sobie, a potem jak ją wykorzystać i "podstawić" do przycisku, aby coś się wydarzyło po jego naciśnięciu. Oto pierwsza metoda: klasa wewnętrzna. Szczegóły w środku!
Tweet |
KLASA WEWNĘTRZNA CZYLI ZAGNIEŻDŻANIE KLAS
Traktujcie klasę wewnętrzną jak "klasę w klasie". I to dosłownie. Zanim twórcy Javy wymyślili "wyrażenie lambda" (na jego temat wypowiadam się tutaj), trzeba było sobie radzić "w obejściu". Kolokwialnie rzecz ujmując, to było takie "lewe" dojście do celu i spełnienie własnych oczekiwań. Taka klasa była odrębnym blokiem kodu, która znajdowała się w klasie właściwej trzymającej tę drugą "w środku".
Oprócz podpinania zdarzeń do jakiegoś komponentu będącego źródłem zdarzeń oraz polimorficznego rzutowania klasy na inny typ niepochodzący z drzewa dziedziczenia, nie było innych praktycznych zastosowań poza zwiększeniem organizacji kodu czy nietypowym "grupowaniem" danych. Stąd też była rzadko wykorzystywana i istniała głównie jako "ułatwiacz łączności" dla komponentów "Swing". Klasa wewnętrzna posiada dostęp do wszystkich danych składowych i metod zarówno tych publicznych, jak i prywatnych.
KOD ŹRÓDŁOWY Z ZAGNIEŻDŻONĄ KLASĄ
Więcej się o tym napisać nie da, obecnie w 2020 roku jest rzadko wykorzystywana z powodu istnienia bardziej zwięzłej alternatywy w postaci wyrażenia lambda. Oto przykładowy program:
- KLASA "Main"
public class Main
{
public static void main(String[] args)
{
new InnerClass(25);
}
}
- KLASA "InnerClass"
public class InnerClass
{
private int x;
public InnerClass(int x)
{
AnotherClass ac = new AnotherClass();
this.x = x;
ac.printX();
ac.printY();
}
private class AnotherClass
{
private int y = 45;
private void printX()
{
System.out.println(x);
}
private void printY()
{
System.out.println(y);
}
}
}
Można dostrzec ciekawe zależności. Klasa wewnętrzna ma dostęp do danych składowych i metod, nawet tych prywatnych! To działa w obie strony! Mimo tego, że "printX" i "printY" są prywatne, to jednak można bez żadnych problemów wywołać te funkcje. Zwróćcie jeszcze uwagę na utworzenie instancji tej klasy! Tu nie ma taryfy ulgowej i też musimy zadbać o utworzenie instancji. Zabawa się jeszcze bardziej rozkręca gdybyśmy chcieli tworzyć instancje klasy wewnętrznej na zewnątrz tej klasy, która ją posiada! Wówczas musielibyśmy dorzucić cały "sznurek" odwoływania się do poszczególnych klas i to po obu stronach:
InnerClass.AnotherClass = new InnerClass.AnotherClass();
Może któregoś razu dużo później napiszę artykuł w jaki sposób można korzystać z klas zagnieżdżonych na zewnątrz jednak tylko celem ukazania jak to wygląda.
Ja w tym momencie Was opuszczam i w kolejnym artykule zaprezentuję jak klasa wewnętrzna może nam rozwiązać problem "podpięcia" zdarzenia do przycisku w "Swing".