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!

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 należała do klasy 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 staranniejszym "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 to już jedynie element historii języka Java, a nawet jeśli jest jeszcze wykorzystywana to myślę, że mniej niż 1% wszystkich projektów na świecie. Nie będę się bawił w dane statystyczne, przejdźmy do przykładowego programu i zakończmy to:

  • 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();

Tak...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".

PODOBNE ARTYKUŁY