Java » Swing

FlowLayout

  • 2010-10-31 18:27
  • 0 komentarzy
  • 933 odsłony
  • Oceń ten tekst jako pierwszy
 

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.FlowLayout1 (FL).

Podstawy ogólnie


Jeżeli chcesz zrozumieć jak działają LM zapoznaj się z BorderLayout#id-Podstawy-ogólnie.

FlowLayout informacje podstawowe


FlowLayot 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:
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


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 FL możemy użyć jednego z dwóch konstruktorów z parametrami.
  1. FlowLayout(int wyrównanie) - gdzie wyrównanie może przyjmować wartości
    1. FlowLayout.LEADING - wyrównanie do lewej
    2. FlowLayout.CENTER - wyrównanie do środka (domyślne)
    3. FlowLayout.TRAILING - wyrównanie do prawej
  2. FlowLayout(int wyrównanie, int x, int y) - gdzie wyrównanie może przyjmować wartości tak jak powyżej, a x i y 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.
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 setComponentOrientation(), która wywoływana jest na obiekcie panelu. Poniższy program, w linii 30, demonstruje takie użycie:
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 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 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 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  

[1] 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