Jason. Cała informatyka w jednym miejscu!

Czy jesteście gotowi na poznanie kolejnego menedżera układu zaraz po "FlowLayout"? Język Java trochę ich posiada. Jeśli musicie mieć koniecznie po jednym komponencie w danym rzędzie bez względu na to, czy wyczerpuje całą wolną szerokość, czy nie, zaznajomię Was z menedżerem stworzonym do takich celów. Pada nazwa "BoxLayout" w "Swing" i wszystko staje się jasne.

"BOXLAYOUT" W "SWING" JESZCZE JEDNĄ MOŻLIWOŚCIĄ

Wbrew nazwie, menedżer ten nie robi niczego z komponentami w sposób "skrzynkowy", a tylko sprawia, że każdy komponent ma cały rząd tylko dla siebie. W przeciwieństwie do "FlowLayout" gdzie, w zależności od miejsca zastosowania, wyczerpywane jest miejsce do granic wytrzymania, tutaj w momencie dodawania każdego nowego komponentu, "schodzi się" za każdym razem o jeden stopień niżej.

Ograniczę się dzisiaj do jednego przykładu, choć można bez problemu osadzić "BoxLayout" w "Swing" do obiektu "JFrame". Konstruktor potrzebuje domyślnie DWÓCH parametrów. Pierwszym jest docelowy komponent i tam musicie dać "getContentPane", a drugim kontrolujecie czy menedżer ma ustawiać te komponenty rzędowo lub kolumnowo. Obrazki umieszczone na samym dole artykułu ukazują tę różnicę w wyglądzie.

Przejdziemy teraz do kodu źródłowego. Standardowo metoda "main" w osobnej klasie oraz dwie następne służące do prezentacji:

KLASA "MAIN"

public class Main {
	public static void main(String[] args) {
		new SwingFrame();
	}
}

KLASA "SWINGFRAME"

import java.awt.*;
import javax.swing.*;

public class SwingFrame extends JFrame {
	private BoxLayoutPanel boxLayoutPanel;

	public SwingFrame() {
		super();
		createInstances();
		setVisible(true);
		setResizable(false);
		setTitle("Box Layout");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(320, 240);
		setLocationRelativeTo(null);
		addToFrame();
	}

	private void createInstances() {
		boxLayoutPanel = new BoxLayoutPanel();
	}

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

		pane.add(BorderLayout.NORTH, boxLayoutPanel);
	}
}

KLASA "BOXLAYOUTPANEL"

import java.awt.*;
import javax.swing.*;
import javax.swing.border.LineBorder;

public class BoxLayoutPanel extends JPanel {
	private JButton buttonA, buttonB, buttonC;

	public BoxLayoutPanel() {
		setBorder(new LineBorder(Color.BLACK));
		setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
		createInstances();
		addToPanel();
	}

	private void createInstances() {
		buttonA = new JButton("Przycisk A");
		buttonB = new JButton("Dłuższy przycisk B");
		buttonC = new JButton("Przycisk C");
	}

	private void addToPanel() {
		add(buttonA);
		add(buttonB);
		add(buttonC);
	}
}

Teraz będą dodawane przyciski dla miłej odmiany. "BoxLayout" w "Swing" osadzony jest w "JPanel" i da taki sam rezultat gdy będzie znajdował się w ramce "JFrame". Uruchamiając program, ujrzycie trzy przyciski ustawione w jednej kolumnie z zakotwiczeniem do lewej strony. To jest zachowanie dla osi Y. Tak jak napisałem wcześniej, menedżera nie obchodzi czy dany komponent obejmuje całą szerokość, czy nie. Jeden rząd, jeden komponent. Taka jest podstawowa reguła.

Co ciekawe, jeśli zamienimy ustawianie na oś X, to wówczas otrzymamy to samo zachowanie jakie miało miejsce przy menedżerze układu "FlowLayout" i od razu uprzedzam, że też będzie wyjście poza ekran programu, jeśli suma szerokości komponentów okaże się większa od szerokości okna programu.

"BoxLayout" w Swing w osi X "BoxLayout" w Swing w osi Y

"BoxLayout" w "Swing" w osi X, umieszcza wszystkie komponenty w jednym rzędzie ryzykując "wyjściem" poza ekran, a w osi Y jeden rząd obejmuje tylko jeden komponent.


Artykuł dobiegł końca. Poeksperymentujcie sami, wtedy wychodzi z tego najlepsza nauka. Bez praktyki, nie nauczycie się programowania. A tutaj jest kolejny menedżer do poznania.

PODOBNE ARTYKUŁY