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 👇:
- północną (BorderLayout.NORTH),
- południową (BorderLayout.SOUTH),
- wschodnią (BorderLayout.EAST),
- zachodnią (BorderLayout.WEST),
- 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" 👇:
![]() |
"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" 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

