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

PODOBNE ARTYKUŁY