2024-05-20 16:54:13
  • Hello!
  • Whats ya doin?
  • ByeBye

[&]

3.136.17.105

Menagery układów treści

workshop: #swing-layouts.html

Swing Layouts

Managery układów do układnaia kontrolek

Przygotowanie

  1. 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();
	}
}

Podsumowanie

  1. None or Empty