FlowLayout

Koziołek

1 Podstawy ogólnie
2 FlowLayout informacje podstawowe

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 <samp>java.awt.FlowLayout</samp>[#]_ (FL).

Podstawy ogólnie

Jeżeli chcesz zrozumieć jak działają LM zapoznaj się z BorderLayout.

FlowLayout informacje podstawowe

<samp>FlowLayot</samp> 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 menadżera: ```java 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. FlowLayot sposób użycia ================================ FL 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 panelu. 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 ---------------------------------------------------------- <samp>FlowLayout</samp> 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 FL możemy użyć jednego z dwóch konstruktorów z parametrami. 1. <samp>FlowLayout(int wyrównanie)</samp> - gdzie <samp>wyrównanie</samp> może przyjmować wartości 1. <samp>FlowLayout.LEADING</samp> - wyrównanie do lewej 2. <samp>FlowLayout.CENTER</samp> - wyrównanie do środka (domyślne) 3. <samp>FlowLayout.TRAILING</samp> - wyrównanie do prawej 2. <samp>FlowLayout(int wyrównanie, int x, int y)</samp> - gdzie <samp>wyrównanie</samp> może przyjmować wartości tak jak powyżej, a <samp>x</samp> i <samp>y</samp> odpowiadają za odległość pomiędzy komponentami odpowiedni w poziomie i pionie. Poniższy program prezentuje zastosowanie różnych wartości dla wyrównania i odległości. ```java 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. <bdo dir="rtl">Przykładowo w hebrajskim</bdo>. Możemy określić kierunek wstawiania elementów za pomocą metody <samp>setComponentOrientation()</samp>, która wywoływana jest na obiekcie panelu. Poniższy program, w linii 30, demonstruje takie użycie: ```java 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 ---------------------------------------------------------- <samp>FlowLayout</samp> w swoich kalkulacjach wykorzystuje preferowany rozmiar komponentu. Oznacza to, że komponent zostanie 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 <samp>pack()</samp> 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 ================================= <samp>FlowLayout</samp> jest jednym z najprostszych i najelastyczniejszych 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ż ====================== BorderLayout BoxLayout CardLayout GridLayout GridBagLayout GroupLayout SpringLayout .. [#] Pełna dokumentacja klasy BorderLayout w javie 1.5 znajduje się pod adresem: http://java.sun.com/j2se/1.5.0/docs/api/java/awt/FlowLayout.html

0 komentarzy