Ponownie zmierzamy w stronę dylematu "podpinania" zdarzeń do przycisków w Javie przy pomocy biblioteki "Swing". Mamy klasy wewnętrzne, a teraz wyrażenie lambda przybliży nas do celu. Gdy zobaczycie jak je zastosować do przycisku, nie będę musiał się nawet pytać która z metod wydaje się Wam przyjemniejsza. Bez ceregieli. Obsługa zdarzeń za pomocą wyrażenia lambda!

OBSŁUGA ZDARZEŃ "PO NOWEMU"

Wyrażenia lambda są doskonałe jeśli chodzi o konieczność dodania zdarzenia nie tylko do przycisku, ale do każdego komponentu biblioteki "Swing". Dzięki skróconej formie zapisu, funkcja anonimowa pozwala uniknąć tworzenia dodatkowych odrębnych klas tylko dla tego jedynego przypadku. Tam, gdzie trzeba było implementować konkretny interfejs, tutaj nie trzeba żadnych implementacji! Funkcja sama się "zaopatrzy" w konieczny interfejs przez co nasz kod się pięknie skróci.

Obsługa zdarzeń dzięki wyrażeniom lambda jest bardzo przyjemna bo kończy się tylko na dołożeniu funkcji tylko w jednym miejscu. Nadal trzeba korzystać z metody "addActionListener", natomiast za parametr podajemy nasze wyrażenie lambda zamiast klasy implementującej interfejs.

PRZYKŁAD Z DWOMA PRZYCISKAMI

Nie ma co się dalej rozpisywać. Obsługa zdarzeń dwóch przycisków na jednej "ramce" pełniącej rolę okna aplikacji, ale tym razem z użyciem samych wyrażeń lambda. Porównajcie sobie ten kod z poprzednim i zobaczcie jaka jest różnica obszerności:

  • KLASA "Main"
public class Main
{
	public static void main(String[] args)
	{
		new SwingButton();
	}
}
  • KLASA "SwingWindow"
import java.awt.*;
import javax.swing.*;

public class SwingButton extends JFrame
{
	private JButton buttonA, buttonB;

	public SwingButton()
	{
		createInstances();
		addButtonListeners();
		addToFrame();
		configure();
	}

	private void createInstances()
	{
		buttonA = new JButton("Kliknij mnie!");
		buttonB = new JButton("Najpierw mnie!");
	}

	private void addButtonListeners()
	{
		buttonA.addActionListener(e -> System.out.println("PRZYCISK A ZOSTAŁ KLIKNIĘTY!"));
		buttonB.addActionListener(e ->
		{
			System.out.println("PRZYCISK B ZOSTAŁ KLIKNIĘTY!");
			buttonA.setEnabled(false);
		});
	}

	private void addToFrame()
	{
		Container pane = getContentPane();

		pane.add(BorderLayout.NORTH, buttonA);
		pane.add(BorderLayout.SOUTH, buttonB);
	}

	private void configure()
	{
		setTitle("Obsługa zdarzeń przycisków w Swing");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		setResizable(false);
		setSize(512, 256);
		setLocationRelativeTo(null);
	}
}

Widzicie tę różnicę? Po pierwsze, połowa importów mniej. Po drugie, żadnych interfejsów wymagających zaimplementowania. Po trzecie, żadnych klas wewnętrznych umieszczanych w innym miejscu. Wszystko znajduje się tylko tam, gdzie jest to konieczne. Obsługa zdarzeń od razu staje się prostsza! Zmieniłem tylko zdarzenie przycisku B dodając do komunikatu funkcję kontrolującą aktywność przycisku A, metodę "setEnabled". W tym przypadku podałem "false", a z praktycznego punktu widzenia spowoduje to "wyłączenie" drugiego przycisku (nie utożsamiać z metodą "setVisible", która kontroluje widoczność przycisku!). Chciałem Wam pokazać jak wygląda ta wersja "klamerkowa" używana dla dwóch lub więcej instrukcji. Taka forma jest jak najbardziej poprawna, o ile piszemy w Javie 8.


Teraz dopiero ogłaszam koniec tego długiego tematu. Na tym oczywiście nie zakończę pisania o "Swing", a naszym kolejnym zagadnieniem będzie wyjaśnienie układu "BorderLayout", który jest domyślny dla klasy "JFrame" zawartym w tym miejscu. Dzięki za uwagę.

PODOBNE ARTYKUŁY