FlowLayout

Koziołek

1 Wstęp
2 FlowLayout – informacje podstawowe
3 FlowLayout – sposób użycia
     3.1 Tworzenie FlowLayout – zarządzanie układem
     3.2 Tworzenie FlowLayout – zarządzanie kolejnością
     3.3 Tworzenie FlowLayout – informacje dodatkowe
4 Podsumowanie
5 Zobacz też

Wstęp

Informacja: Jeżeli chcesz zrozumieć, jak działa Layout Manager – zapoznaj się z BorderLayout.

Pracując z komponentami Swing dość szybko zorientujemy się, że ich ułożeniem można sterować na kilka sposobów. Najprostszym z nich jest ręczne ustawianie każdego z komponentów w kontenerze. By mieć taką możliwość, musimy wyzerować Layout Managera danego kontenera:

container.setLayout(null);

Takie podejście ma wiele wad. Największą z nich jest konieczność ręcznego wpisywania położeń dla wszystkich komponentów w kontenerze. Jak wiadomo, każdy nadmiarowy kod jest przyczyną nowych ciekawych błędów. Błędów chcemy unikać.

W tym artykule przedstawiony będzie java.awt.FlowLayout (FL).

FlowLayout – informacje podstawowe

FlowLayout jest jednym z najprostszych i najbardziej intuicyjnych menadżerów wyglądu w API języka Java. Jego zasada działania opiera się na dołączaniu kolejnych elementów na końcu listy i ich wyświetlaniu jeden po drugim w komponencie rodzica. Porównując sposób działania tego menadżera ze znanymi nam obiektami ze świata realnego, można przyjąć, że działa on jak pismo. Kolejne słowa są dołączane na końcu wiersza, po czym, jeżeli osiągnięto koniec wiersza, przechodzimy do kolejnej linii. Poniższy program demonstruje zasadę działania tego menadżera:

package pl.koziolekweb.programmers.java.flowlayout;

import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

public class FlowLayoutApp {

	public static void main(String[] args) {
		JFrame mainFrame = new JFrame("FlowLayout App1");
		JButton b1 = new JButton("button 1");
		JButton b2 = new JButton("button 2");
		JButton b3 = new JButton("button 3");
		JButton b4 = new JButton("button 4");
		mainFrame.setLayout(new FlowLayout());
		mainFrame.setSize(new Dimension(300, 300));
		mainFrame.add(b1);
		mainFrame.add(b2);
		mainFrame.add(b3);
		mainFrame.add(b4);
		
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		mainFrame.pack();
		mainFrame.setVisible(true);
	}

}

W programie tym tworzymy prostą ramkę i cztery przyciski, które do niej dodajemy. Jak widać, przyciski ustawiły się jeden za drugim. Jeżeli zaczniemy zmieniać rozmiar okna, to zobaczymy, że przyciski zmieniają swoje położenie tak, by wszystkie elementy mieściły się w szerokości okna.

FlowLayout – sposób użycia

FlowLayout jest bardzo dobrym rozwiązaniem wszędzie tam, gdzie chcemy dodawać elementy do panelu, ale nie zależy nam na sztywnym ich rozmieszczeniu względem niego. Szczególnie przydatne jest to przy tworzeniu różnych komponentów w postaci pasków przycisków, serii zdjęć itp.

Tworzenie FlowLayout – zarządzanie układem

FlowLayout może, tak jak pismo, umieszczać komponenty w różny sposób. Domyślnie komponenty są ustawiane w panelu w taki sposób, że po obliczeniu szerokości komponentu następuje centrowanie układu. Komponenty są umieszczane od prawej do lewej, a odległość pomiędzy nimi wynosi domyślnie 5px w poziomie i 5px w pionie.

Jeżeli chcemy zmienić domyślne zachowanie FlowLayout, możemy użyć jednego z dwóch konstruktorów z parametrami:

  1. FlowLayout(int wyrównanie) – gdzie parametr wyrównanie może przyjmować następujące wartości:
  • FlowLayout.LEADING – wyrównanie do lewej,
  • FlowLayout.CENTER – wyrównanie do środka (domyślne),
  • FlowLayout.TRAILING – wyrównanie do prawej;
  1. FlowLayout(int wyrównanie, int x, int y) – gdzie wyrównanie może przyjmować wartości tak jak powyżej, a parametry x i y odpowiadają za odległość pomiędzy komponentami – odpowiednio w poziomie i w pionie.

Poniższy program prezentuje zastosowanie różnych wartości dla wyrównania i odległości:

package pl.koziolekweb.programmers.java.flowlayout;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class FlowLayoutApp2 {

	public static void main(String[] args) {
		JFrame mainFrame = new JFrame("FlowLayout App1");
		mainFrame.setLayout(new GridLayout(3, 1));
		mainFrame.setSize(new Dimension(500, 100));

		createPanel(mainFrame, FlowLayout.LEADING);
		createPanel(mainFrame, FlowLayout.CENTER);
		createPanel(mainFrame, FlowLayout.TRAILING);
		mainFrame.setMinimumSize(new Dimension(500, 100));
		mainFrame.pack();
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		mainFrame.setVisible(true);
	}

	private static void createPanel(JFrame mainFrame, int align) {
		JPanel panel = new JPanel(new FlowLayout(align));
		panel.setSize(new Dimension(450, 30));
		JButton b1 = new JButton("button 1");
		JButton b2 = new JButton("button 2");
		JButton b3 = new JButton("button 3");
		JButton b4 = new JButton("button 4");

		panel.add(b1);
		panel.add(b2);
		panel.add(b3);
		panel.add(b4);

		mainFrame.add(panel);
	}

}

Tworzenie FlowLayout – zarządzanie kolejnością

Pismo ma jeszcze jedną właściwość. Otóż w niektórych językach piszemy od prawej do lewej (przykładowo w języku hebrajskim). Możemy określić kierunek wstawiania elementów za pomocą metody setComponentOrientation(), która wywoływana jest na obiekcie panelu. Poniższy program demonstruje takie użycie (linia 30):

package pl.koziolekweb.programmers.java.flowlayout;

import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class FlowLayoutApp {

	public static void main(String[] args) {
		JFrame mainFrame = new JFrame("FlowLayout App1");
		mainFrame.setLayout(new GridLayout(3, 1));
		mainFrame.setSize(new Dimension(500, 100));

		createPanel(mainFrame, FlowLayout.LEADING, ComponentOrientation.LEFT_TO_RIGHT);
		createPanel(mainFrame, FlowLayout.CENTER, ComponentOrientation.RIGHT_TO_LEFT);
		createPanel(mainFrame, FlowLayout.TRAILING, ComponentOrientation.UNKNOWN);
		mainFrame.setMinimumSize(new Dimension(500, 100));
		mainFrame.pack();
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		mainFrame.setVisible(true);
	}

	private static void createPanel(JFrame mainFrame, int align, ComponentOrientation orientation ) {
		JPanel panel = new JPanel(new FlowLayout(align));
		panel.setComponentOrientation(orientation);
		panel.setSize(new Dimension(450, 30));
		JButton b1 = new JButton("button 1");
		JButton b2 = new JButton("button 2");
		JButton b3 = new JButton("button 3");
		JButton b4 = new JButton("button 4");

		panel.add(b1);
		panel.add(b2);
		panel.add(b3);
		panel.add(b4);

		mainFrame.add(panel);
	}

}

Tworzenie FlowLayout – informacje dodatkowe

FlowLayout w swoich kalkulacjach wykorzystuje preferowany rozmiar komponentu. Oznacza to, że komponent pozostanie w kolejnej linii wtedy, kiedy suma preferowanych szerokości już dodanych komponentów i aktualnie dodawanego komponentu będzie większa niż szerokość panelu.

Wywołanie metody pack() na rzecz panelu spowoduje, że komponenty będą ustawione jeden za drugim (w jednej linii). Innymi słowy, jeżeli komponent będzie trzeba dodać w nowej linii, to panel odpowiednio zwiększy swoją szerokość.

Podsumowanie

FlowLayout jest jednym z najprostszych i najbardziej elastycznych menadżerów wyglądu. Ma jednak swoje ograniczenia i powinien być wykorzystywany tylko tam, gdzie nie zależy nam na sztywnym rozmieszczeniu elementów.

Zobacz też

0 komentarzy