Swing Layouts Managery układów do układnaia kontrolek Przygotowanie Utwórz katalog 02-layouts w a nim twórz klasy dla każdego układu 1 Spis często stosowanych Layout'ów Charakterystyka Border Layout Box Layout Card Layout (Tabbed version) Card Layout (CheckBox version) Flow Layout Grid Layout Group Layout Spring Layout Custom Layout 2 Border Layout Charakterystyka Domyślny układ dla większości Paneli Posiada 5 stref umiesczania elementów Domyślną strefą (gdy nie wskazujemy strefy) dla elementu jest CENTER Strefy można nazywać: TOP, LEFT, CENTER, RIGHT, BOTTOM ... lub: NORTH, WEST, CENTER, EAST, SOUTH /* Classname - Border * Version information - 1.1.0 * Date - 2021-01-01 * Copyright notice - Petri Grzegorz */ import java.awt.*; // Dimension class import javax.swing.*; // JComponents classes public class Border { JFrame box; String positions[] = { BorderLayout.PAGE_START, BorderLayout.LINE_START, BorderLayout.CENTER, BorderLayout.LINE_END, BorderLayout.PAGE_END}; // String positions[] = { BorderLayout.NORTH, BorderLayout.WEST, BorderLayout.CENTER, BorderLayout.EAST, BorderLayout.SOUTH}; Border(){ box = new JFrame("Layouts: Border"); box.setLayout(new BorderLayout()); // box.setBorder(BorderFactory.createEmptyBorder(30,30,10,30)); for( int i=0; i<5; i++){ JButton btn = new JButton("Przycisk "+(i+1)); box.add(btn,positions[i]); } // box.pack(); box.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); box.setMinimumSize(new Dimension(400,200)); // box.setSize(640,480); box.setVisible(true); } public static void main( String[] args){ new Border(); } } 3 Box Layout Charakterystyka Odpowiednik Flex Layout z HTML5 lecz bez* Pozwala ustawić elementy pionowo lub poziomo Ustawia elementy względem linii bazowej Nie posiada opcji *zawijania elementów, kiedy kończy się miejsce (rozwiązanie: Flow Layout) /* Classname - nazwa klasy * Version information - informacje o wersji * Date - data wydania * Copyright notice - notka prawna */ import java.awt.*; // Dimension class import javax.swing.*; // JComponents classes public class Box extends Frame { JFrame box; int axis = BoxLayout.X_AXIS;// oś względem której elementy są układane Box(){ Float alignsx[] = { Component.LEFT_ALIGNMENT, // 0.0f Component.CENTER_ALIGNMENT, // 0.5f Component.RIGHT_ALIGNMENT, // 1.0f Component.CENTER_ALIGNMENT, // 0.5f Component.LEFT_ALIGNMENT // 0.0f }; Float alignsy[] = { Component.BOTTOM_ALIGNMENT, // 0.0f Component.CENTER_ALIGNMENT, // 0.5f Component.TOP_ALIGNMENT, // 1.0f Component.CENTER_ALIGNMENT, // 0.5f Component.BOTTOM_ALIGNMENT // 0.0f }; box = new JFrame(); box.setTitle("Layouts: Box"); box.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // BoxLayout: X_AXIS, Y_AXIS, LINE_AXIS, PAGE_AXIS box.setLayout(new BoxLayout(box.getContentPane(),axis)); for( int i=0; i<5; i++){ JButton btn = new JButton("Przycisk "+(i+1)); if( axis == BoxLayout.X_AXIS ) btn.setAlignmentY(alignsx[i]); else btn.setAlignmentX(alignsy[i]); // zamiast tablicy alignsx LUB alignsy należy wprowadzić // jedną z dostępnych wartości: np. Component.BOTTOM_ALIGNMENT // zastosowanie tablicy jest spowodowane chęcią skrócenia kodu box.getContentPane().add(btn); } // Wyświetlanie okna box.setMinimumSize(new Dimension(400,200)); box.setSize(640,480); box.pack(); box.setVisible(true); } public static void main( String[] args){ new Box(); } } 4 Card Layout (tabbed) Charakterystyka Funkcjonalność przełączania zakładek nie wymaga obsługi Zdarzeń Wymagane elementy: 1x Panel zakładek oraz 2x Panel treści /* Classname - Card * Version information - 1.0.0 * Date - 2021-01-03 * Copyright notice - Petri Grzegorz */ import java.awt.*; import javax.swing.*; public class Card { // deklaracja globalnych kontenerów JFrame box; public Card(){ // kontenery do przechowywania komponentów JPanel pnl1 = new JPanel(){ public Dimension getPreferredSize(){ // zwiększenie szerokości panelu, by Zakładki wyświetlały się w 1 linii Dimension size = super.getPreferredSize(); size.width += 100; return size; } }; JPanel pnl2 = new JPanel(); pnl1.setBackground(Color.YELLOW); pnl2.setBackground(Color.BLUE); // dodawanie komponentów do kontenerów Paneli JLabel lbl1 = new JLabel("Panel raz"); JLabel lbl2 = new JLabel("Panel dwa"); lbl1.setForeground(new Color(123456)); lbl2.setForeground(Color.WHITE); pnl1.add(lbl1); pnl2.add(lbl2); // ustawienia przycisków zakładek JTabbedPane tabs = new JTabbedPane(); tabs.addTab("Zakładka 1",pnl1); tabs.addTab("Zakładka 2",pnl2); // ustawienia kontenera okna programu box = new JFrame("Layouts: Card (tabs)"); box.getContentPane().add(tabs,BorderLayout.CENTER); box.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // box.pack(); // wraz z Dimension getPreferredSize() z linii 15 box.setSize(400,200); box.setVisible(true); } public static void main( String[] args){ new Card(); } } 5 Card Layout (checkbox) Charakterystyka Funkcjonalność przełączania zakładek WYMAGA obsługi Zdarzeń Wymagane elementy: 1x ComboBox oraz 2x Panel treści Mechanizm obsługi wymaga odczytania wybranego z ComboBox'a elementu /* Classname - CardCBox * Version information - 1.0.0 * Date - 2021-01-03 * Copyright notice - Petri Grzegorz */ import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CardCBox implements ItemListener { // deklaracja globalnych kontenerów JFrame box; JPanel cards; String itemNames[] = { "Zakładka 1","Zakładka 2" }; public CardCBox(){ // kontenery do przechowywania komponentów JPanel pnl1 = new JPanel(); JPanel pnl2 = new JPanel(); pnl1.setBackground(Color.YELLOW); pnl2.setBackground(Color.BLUE); // dodawanie komponentów do kontenerów Paneli JLabel lbl1 = new JLabel("Panel raz"); JLabel lbl2 = new JLabel("Panel dwa"); lbl1.setForeground(new Color(123456)); lbl2.setForeground(Color.WHITE); pnl1.add(lbl1); pnl2.add(lbl2); // ustawienia przycisków zakładek JPanel cbPane = new JPanel(); JComboBox cBox = new JComboBox(itemNames); cBox.setEditable(false); cBox.addItemListener(this); cbPane.add(cBox); // tworzenie kontenera na treść zakładek cards = new JPanel(new CardLayout()); cards.add(pnl1,"Zakładka 1"); cards.add(pnl2,"Zakładka 2"); // ustawienia kontenera okna programu box = new JFrame("Layouts: Card (combobox)"); box.getContentPane().add(cbPane,BorderLayout.PAGE_START); box.getContentPane().add(cards,BorderLayout.CENTER); box.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // box.pack(); box.setSize(400,200); box.setVisible(true); } public void itemStateChanged(ItemEvent e){ CardLayout cl = (CardLayout)(cards.getLayout()); cl.show(cards, (String)e.getItem()); } public static void main( String[] args){ new CardCBox(); } } 6 Flow Layout Charakterystyka Odpowiednik Flex Layout z HTML5 Umozliwia zawijanie elmenetów kiedy bark miejsca w oknie/panelu /* Classname - nazwa klasy * Version information - informacje o wersji * Date - data wydania * Copyright notice - notka prawna */ import java.awt.*; // Dimension class import javax.swing.*; // JComponents classes public class Flow { JFrame box; Flow(){ box = new JFrame("Layouts: Flow"); // LEFT, CENTER, RIGHT, LEADING, TRAILING box.setLayout(new FlowLayout(FlowLayout.TRAILING)); for( int i=0; i<5; i++){ JButton btn = new JButton("Przycisk "+(i+1)); box.add(btn); } // box.pack(); box.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); box.setMinimumSize(new Dimension(400,100)); box.setSize(640,480); box.setVisible(true); } public static void main( String[] args){ new Flow(); } } 7 Grid Layout Charakterystyka Odpowiednik Grid Layout z HTML5 /* Classname - nazwa klasy * Version information - informacje o wersji * Date - data wydania * Copyright notice - notka prawna */ import java.awt.*; // Dimension class import javax.swing.*; // JComponents classes public class Grid { int rows = 5; // ile wierszy int cols = 3; // ile kolumn int btns = rows*cols; // ile przycisków int xgap = 0; // odstępy poziome pomiędzy komponentami (w px) int ygap = 15; // odstępy pionowe pomiędzy komponentami (w px) JFrame box; Grid(){ box = new JFrame("Layouts: Grid"); box.setLayout(new GridLayout(rows, cols, xgap, ygap)); for( int i=0; i<btns; i++){ JButton btn = new JButton("Przycisk "+(i+1)); box.add(btn); } box.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); box.setMinimumSize(new Dimension(400,200)); box.setSize(640,480); box.setVisible(true); } public static void main( String[] args){ new Grid(); } }