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" (co będzie tematem innego artykułu), 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 każdego elementu, 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 tylko jako jedynie "wtyczka" do 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 danej składowej "x", ale w drugą stronę tak nie działa! Co ciekawe, jeśli spojrzymy na metody to 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