Podczas omawiania poprzednich tematów z biblioteki "Swing" (język Java) padło wielokrotnie hasło: "BorderLayout" 🔔. Co to konkretnie jest "BorderLayout" w "Swing"? Niech zawartość artykułu rozwieje te wątpliwości raz na zawsze 😄!

"BORDERLAYOUT" W "SWING" JEST JEDNYM Z UKŁADÓW!

O samym pojęcie układu wypowiedziałem się w odrębnym artykule, więc ten materiał zakłada, że już go przeczytałeś(-aś) i dobrze wiesz co to jest 🙃. A tu się przyjrzymy czym jest "BorderLayout". Jak to wygląda? Jak się tym posługiwać? Po kolei 😅!

"BORDERLAYOUT"

Konkretnie jest to jeden z dostępnych układów posiadający pięć tzw. "regionów" ⚠️. W każdym z tych regionów można wstawić jeden komponent ℹ️. Regiony dzielą się na 5 części 👇:

  1. północną (BorderLayout.NORTH),
  2. południową (BorderLayout.SOUTH),
  3. wschodnią (BorderLayout.EAST),
  4. zachodnią (BorderLayout.WEST),
  5. centralną (BorderLayout.CENTER).

Zwróć uwagę na nietypowe hasła w nawiasach ⚠️! To są zdefiniowane wartości typu wyliczeniowego, którymi posługujemy się w celu określenia do którego regionu, dany komponent chcemy dodać ✅.

Charakterystyczną cechą "BorderLayout" jest to, iż automatycznie dostosowuje wymiary komponentów "podstawionych" do tych regionów. Jeżeli dla przykładu, jest zajęta tylko część wschodnia, to komponent przyjmie całą wysokość okna ⚠️. Jeżeli natomiast, jest jeszcze dodatkowo część północna, to układ przeznacza miejsce na wysokość dla części północnej "obcinając" wysokość przeznaczoną dla części wschodniej. W taki sposób działa "BorderLayout" w "Swing" 😉.

Poniżej zostawiam rysunek pomocniczy w jaki sposób regiony są ułożone w "BorderLayout" 👇:

Schemat regionów układu "BorderLayout" w "Swing"

"BorderLayout" w "Swing" to domyślny układ komponentu "JFrame" składający się z pięciu "regionów", na których umieszczamy inne komponenty.

W taki sposób wygląda rozmieszczanie komponentów według omawianego schematu. Jeżeli naprawdę chcesz zrozumieć układy w "Swing", polecam zacząć od niego 👍.

PRZYKŁAD KODU ŹRÓDŁOWEGO

Teraz zapoznasz się z kodem źródłowym prostego programu korzystającego z "BorderLayout" w "Swing". Pokaże Ci on również jak korzystać ze wspomnianych regionów 🧡.

KLASA "MAIN"
public class Main {
	public static void main(String[] args) {
		SwingUtilities.invokeLater(MainJFrame::new);
	}
}

W tym miejscu odbywa się jedynie inicjalizacja okna "Swing" poprzez skorzystanie z konstruktora klasy "MainFrame" wewnątrz wywołania metody "invokeLater". To jest zalecana forma zapisu, gdy mamy do czynienia z uruchamianiem dowolnej aplikacji biblioteki "Swing" (więcej informacji znajdziesz w internecie) ℹ️.

KLASA "MAINJFRAME"
import java.awt.*;
import javax.swing.*;

public class MainJFrame extends JFrame {
	private final JButton northButton = new JButton("CZĘŚĆ PÓŁNOCNA");
	private final JButton southButton = new JButton("CZĘŚĆ POŁUDNIOWA");
	private final JButton westButton = new JButton("CZĘŚĆ ZACHODNIA");
	private final JButton eastButton = new JButton("CZĘŚĆ WSCHODNIA");
	private final JButton centeredButton = new JButton("CZĘŚĆ CENTRALNA");

	public MainJFrame() {
		configureFrame();
		addButtonsToFrame();
	}

	private void configureFrame() {
		setTitle("Układ BorderLayout w Swing");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		setResizable(false);
		setSize(1024, 1024);
		setLocationRelativeTo(null);
	}

	private void addButtonsToFrame() {
		var contentPane = getContentPane();

		contentPane.add(BorderLayout.NORTH, northButton);
		contentPane.add(BorderLayout.SOUTH, southButton);
		contentPane.add(BorderLayout.WEST, westButton);
		contentPane.add(BorderLayout.EAST, eastButton);
		contentPane.add(BorderLayout.CENTER, centeredButton);
	}
}

Klasa "MainJFrame" to nasze główne okno, w którym znajduje się (domyślnie) 5 regionów, które opisałem wyżej 👆. Pamiętaj, że "BorderLayout" jest domyślnym układem elementów w "Swing", zatem nie trzeba niczego ustawiać 😄.

Wykorzystujemy dwa importy u góry: "java. awt" i "javax. swing". Żeby pojąć dlaczego jest podział na 2 importy i czemu jeden z nich ma literkę 'x' na końcu, trzeba znać historię biblioteki "Swing" 📜. "Swing" ma swoje korzenie w dawnej bibliotece do tworzenia graficznych interfejsów o nazwie "AWT" (Abstract Window Toolkit) ℹ️. Można go uznawać za "następcę", stąd odwołanie do "awt". A literka 'x' wynika z tego, że wcześniej "Swing" był zewnętrznym rozszerzeniem do Javy, nim został dołączony do języka w wersji 1.2 💡.

Do każdego regionu dodajemy sobie przycisk "JButtton" z tekstem odpowiadającym regionowi. Nie będziemy nadpisywać referencji do składowych, zatem możemy oznaczyć je modyfikatorem "final". W konstruktorze mamy 2 wywołania metod.

Metoda "configureFrame" odpowiada za wywołanie serii instrukcji konfigurujących samo okienko 🔧. Większość jest oczywista, więc wyjaśnię tylko niektóre 👇:

  • "setDefaultCloseOperation" określa jak ma zachować się sam proces w momencie zamknięcia okna (jeżeli chcesz, aby zamknięcie okna jednocześnie zamykało cały proces, to musisz ustawić na "JFrame.EXIT_ON_CLOSE" - domyślnie przyjmuje "JFrame.HIDE_ON_CLOSE"),
  • "setVisible" ustawione na "true", sprawi, że okno będzie widoczne (bo domyślnie będzie zminimalizowane - kolejne "gotcha!" języka Java 😏!),
  • "setLocationRelativeTo" ustawia pozycję okna według podanego w parametrze komponentu (korzystam tutaj z takiego "myka", że wpisując wartość "null", zostanie wycentrowane na środku ekranu 💡).

Metoda "addButtonsToFrame" z kolei, dodaje przyciski do poszczególnych regionów układu "BorderLayout". Aby dodawać komponenty do układu, korzystamy z wywołania "getContentPane", które zwraca referencję do typu "Container" - tam znajduje się "zbiornik" komponentów ℹ️. "var" to słowo kluczowe pozwalające uniknąć ręcznego definiowania typu zmiennej lokalnej 👍.

Metoda "add" przyjmuje 2 parametry: stała typu wyliczeniowego zdefiniowania dla regionów (zgodnie z opisem powyżej) i komponent jaki ma się znaleźć 🙂.

Po odpaleniu programu, ujrzysz następujący widok 👇:

Wygląd okna z układem "BorderLayout" w "Swing"

Wygląd okna z układem "BorderLayout" i wstawionymi komponentami we wszystkich 5 regionach.

Czyli dokładnie tak, jak na rysunku powyżej 😄! Na sam koniec przypomnę, że "BorderLayout" jest jednym z kilku dostępnych układów w "Swing". Zapraszam do stosownego artykułu po zapoznanie się z innymi układami 🔍.


Koniec 😄! Gdybyś chciał(a) się bardziej zagłębić w temat, polecam posiłkowanie się dokumentacją Javy ℹ️.

NASTĘPNY ARTYKUŁ: paintComponent w Swing. Metoda rysująca komponentu JPanel

PODOBNE ARTYKUŁY