Jesteście gotowi na ostatni wariant menedżera, który zaprezentuję? Trzymamy się kurczowo Javy i biblioteki Swing, a dzisiaj pokażę Wam najbardziej zaawansowany menedżer układu stanowiący bardziej skomplikowaną wersję poprzednika. Teraz czas na "GridBagLayout", czyli tworzenie nieregularnych siatek komponentów!

"GRIDBAGLAYOUT" - NAJBARDZIEJ ZAAWANSOWANY MENEDŻER

Aby korzystać z tego racjonalnie, potrzebny będzie dodatkowy obiekt pozwalający na konfigurację poszczególnych danych składowych dla osadzania komponentu w odpowiednie miejsce. Mianowicie, tworzycie instancję klasy "GridBagConstraints". Jest to specjalny "worek konfiguracyjny" umożliwiający dostosowywanie wszystkich pól dotyczących tego menedżera układu. Dzięki niemu możecie ustawić między innymi szerokość jednej kratki w jednostkach pól, czyli na ten przykład jedna kratka może zajmować dwa pola szerokości i trzy wysokości. Wszystko zostanie zawarte w poniższym kodzie źródłowym. Tym razem odseparowałem ramkę od panelu, żeby wszystkie rzeczy dotyczące niniejszego artykułu były w jednym miejscu.

Dołączam wszystkie pliki źródłowe dla eksperymentu z "GridBagLayout". Funkcja "main" na dzień dobry jak zwykle dla porządku, a zaraz po niej, obiekt "JFrame" oraz obiekt "JPanel":

  • 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
{
	public SwingFrame()
	{
		setVisible(true);
		setResizable(false);
		setTitle("Grid Bag Layout");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(512+16, 256+9);
		setLocationRelativeTo(null);
		addToFrame();
	}

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

		pane.add(BorderLayout.CENTER, new GridBagLayoutPanel());
	}
}
  • KLASA "GridBagLayoutPanel"
import java.awt.*;
import javax.swing.*;

public class GridBagLayoutPanel extends JPanel
{
	private JLabel label;
	private JButton buttonA, buttonB, buttonC;

	public GridBagLayoutPanel()
	{
		super(new GridBagLayout());
		createInstances();
		addToPanel();
	}

	private void createInstances()
	{
		label = new JLabel("Zwykły tekst");
		buttonA = new JButton("Przycisk A");
		buttonB = new JButton("Przycisk B");
		buttonC = new JButton("Przycisk C");
	}

	private void addToPanel()
	{
		GridBagConstraints gbc = new GridBagConstraints();

		gbc.gridx = gbc.gridy = 0;
		gbc.ipadx = gbc.ipady = 8;

		add(label, gbc);

		gbc.gridx = 2;
		gbc.ipady = 32;
		gbc.gridheight = 2;

		add(buttonA, gbc);

		gbc.gridx = 1;
		gbc.gridy = 1;
		gbc.gridwidth = 1;
		gbc.gridheight = 2;
		gbc.anchor = GridBagConstraints.WEST;
		gbc.ipady = 96;

		add(buttonB, gbc);

		gbc.gridwidth = 2;
		gbc.gridheight = 1;

		gbc.gridx = 0;
		gbc.gridy = 3;

		gbc.ipadx = gbc.ipady = 0;
		gbc.fill = GridBagConstraints.BOTH;

		add(buttonC, gbc);
	}
}

Jak widać na załączonym obrazku, "GridBagLayout" pozwala na swobodne dostosowywanie układu siatki dla komponentów. Natomiast jak będzie widać po kompilacji, ona może znacznie odbiegać od widoku siatkowego i przyjmować nieregularne kształty. Jednym minusem jest fakt, że podawane wartości dla poszczególnych pól nie są zawsze "honorowane". Muszą być zachowywane jakieś restrykcje i priorytety przez co raz otrzymujemy pożądany efekt bez problemów, a czasami nie.

Przedstawię teraz niektóre z edytowalnych parametrów:

  • gridx
    • pozycja X dla komponentu w jednostkach "siatkowych"
  • gridy
    • pozycja Y dla komponentu w jednostkach "siatkowych"
  • gridwidth
    • szerokość komponentu w jednostkach "siatkowych" ("GridBagLayout" pozwala na nieregularne wielkości komponentów działające w stylu "rowspan" i "colspan" dla tabelek w języku HTML)
  • gridheight
    • wysokość komponentu w jednostkach "siatkowych"
  • ipadx
    • margines wewnętrzny komponentu w osi X
  • ipady
    • margines wewnętrzny komponentu w osi Y
  • fill
    • rodzaj "wypełniania" wolnej przestrzeni przez komponent (wprowadzamy stałą wartość - pełna lista znajduje się tutaj)
  • anchor
    • rodzaj "zakotwiczenia" komponentu (pozwala to na ustalenie czy komponent przyjmujący mniejsze rozmiary od wolnej przestrzeni ma się "trzymać" lewej strony, prawej strony lub środka - korzysta się ze stałych wartości nazywanych jak strony świata - pełna lista znajduje się tutaj)

Kilka słów o samym przebiegu działania. Modyfikowane wartości nie wpływają od razu na wszystkie komponenty! Korzysta się z tego w taki sposób, że konfiguruje się odpowiednie pola dla kolejnego komponentu, który chcemy dodać do "GridBagLayout". Czyli krótko pisząc: modyfikacja, dodawanie, modyfikacja, dodawanie. Wywołując metodę "add" i dodając jako drugi parametr "GridBagConstraints", menedżer układu sugeruje się aktualnymi wartościami pól, które zostały nadane tuż przed tą metodą. Jeszcze inaczej można napisać, że każdy komponent konfigurujemy osobno, czyli tworzymy tak jakby każdy osobny "zestaw" wartości przed nowym wstawieniem.

GridBagLayout w JPanel

"GridBagLayout" otwiera drogę programistom do tworzenia bardzo nieregularnych układów komponentów, które nie mogą zostać zrealizowane przy użyciu wszystkich poprzednich menedżerów.


Tyle! Zważywszy, że menedżer ten lubi czasem robić na złość i nie "szanować" pewnych wartości, proponuję go stosować tylko w przypadku, gdy chcemy sobie zrobić własne menu przycisków o nieregularnych kształtach.

PODOBNE ARTYKUŁY