1. 程式人生 > >Java SpringLayout佈局(彈簧佈局)

Java SpringLayout佈局(彈簧佈局)

簡介

由 SpringLayout 類實現的佈局管理器稱為彈簧佈局管理器,利用該佈局管理器管理元件,當改變窗體的大小時,能夠在不改變元件間相對位置的前提下自動調整元件的大小,使元件依舊佈滿整個窗體,從而保證了窗體的整體效果。在使用該佈局管理器時,需要與它的內部類 Constraints 以及 Spring 類配合使用,其中 Constraints類用來管理元件的位置和大小, Spring 類用來 建立彈簧和支架,這也是彈簧佈局管理器的核心,即利用彈簧的可伸縮性動態控制組件的位置和大小。

使用彈簧佈局管理器

彈簧佈局管理器以容器和元件的邊緣為操縱物件,通過為元件和容器邊緣以及元件和元件邊緣建立約束,實現對元件佈局的管理,如下圖所示。

通過方法 putConstraint(String e1, Component c1, int pad, String e2, Component c2)可以為各個邊之間建立約束

e1:需要參考的元件物件的具體需要參考的邊

c1:需要參考的元件物件

pad:兩條邊之間的距離(兩個元件的間距)

e2:被參考的元件物件的具體被參考的邊

c2:被參考的元件物件(也可以是需要參考的元件物件所屬的容器物件)

注意:當e2在e1的北側或西側的時,pad應為正數;當e2在e1的南側或東側的時,pad應為負數

e1和e2的靜態常量:EAST(元件東側的邊)、WEST(元件西側的邊)、NORTH(元件北側的邊)、SOUTH(元件南側的邊)

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

import javax.swing.*;
import static javax.swing.SpringLayout.*;

public class t3 extends JFrame{
	
	SpringLayout springLayout = new SpringLayout();
	
	public t3() {
		setTitle("Hern");
		setBounds(400, 400, 400, 400);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container con = getContentPane();//獲得窗體容器物件
		setLayout(springLayout);//設定窗體佈局格式為彈簧式佈局
		
		JLabel topLabel = new JLabel("主題:");
		add(topLabel);
		springLayout.putConstraint(NORTH, topLabel, 50, NORTH, con);// 主題標籤北側——>容器北側
		springLayout.putConstraint(WEST, topLabel, 50, WEST, con);// 主題標籤西側——>容器西側
		
		JTextField textField = new JTextField();
		add(textField);
		springLayout.putConstraint(NORTH, textField, 50, NORTH, con);//主題文字框北側——>容器北側
		springLayout.putConstraint(WEST, textField, 50, EAST, topLabel);//主題文字框西側——>主題標籤東側
		springLayout.putConstraint(EAST, textField, -50, EAST, con);// 主題文字框東側——>容器東側
		
		JLabel buttonLabel = new JLabel("內容:");
		add(buttonLabel);
		springLayout.putConstraint(NORTH, buttonLabel, 50, SOUTH, textField);// 內容標籤北側(參照文字框是因為文字框高)——>主題文字框南側
		springLayout.putConstraint(WEST, buttonLabel, 50, WEST, con);// 內容標籤西側——>容器西側
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setViewportView(new JTextArea());
		add(scrollPane);
		springLayout.putConstraint(NORTH, scrollPane, 50, SOUTH, textField);// 滾動面板北側——>主題文字框南側
		springLayout.putConstraint(WEST, scrollPane, 50, EAST, buttonLabel);// 滾動面板西側——>內容標籤東側
		springLayout.putConstraint(EAST, scrollPane, -50, EAST, con);// 滾動面板東側——>容器東側
		
		JButton resetButton = new JButton("清空");
		add(resetButton);
		springLayout.putConstraint(SOUTH, resetButton, -50, SOUTH,con);// “清空”按鈕南側——>容器南側
		
		JButton submitButton = new JButton("確定");
		add(submitButton);
		springLayout.putConstraint(SOUTH, submitButton, -50, SOUTH,con);// “確定”按鈕南側——>容器南側
		springLayout.putConstraint(EAST, submitButton, -50, EAST,con);// “確定”按鈕東側——>容器東側
		springLayout.putConstraint(SOUTH, scrollPane, -50, NORTH,submitButton);// 滾動面板南側——>“確定”按鈕北側
		springLayout.putConstraint(EAST, resetButton, -50, WEST,submitButton);// “清空”按鈕東側——>“確定”按鈕西側
		
		setVisible(true);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		t3 test = new t3();

	}

}

 使用彈簧和支柱

利用 Spring 類可以建立彈簧和支柱( Spring 類可以看作是在 SpringLayout 佈局中對距離的度量),但並不是通過構造方法建立,而是通過靜態方法 constant() 建立。

利用方法constant(int min, int pref, int max)建立彈簧時需要設定3個引數,分別為彈簧的最小值、首選值和最大值。最小值可以理解為彈簧被壓縮到極限時的長度;首選值可以理解為彈簧自然放置情況下的長度;最大值可以理解為彈簧被拉伸到極限時的長度。如果這3個值相等,彈簧就沒有了伸縮能力,也就變成了支柱,如果是建立支柱通常利用方法constant(int pref),因為它更方便。

通過方法width(Component c)height(Component c)可以快速獲得一個彈簧,它們的入口引數均為元件物件,所得彈簧的最小值、首選值、最大值和實際值,分別為指定元件最小值(minimumSize)、首選值(preferredSize)、最大值(maximumSize)和實際值(size)的寬度或高度。

Spring類常用方法

static Spring constant(int pref) // 建立一個指定長度的 spring

static Spring sum(Spring s1, Spring s2) // 兩個 spring 相加,得到新的一個 spring

static Spring max(Spring s1, Spring s2) // 計算兩個 spring 之間的較大者

static Spring scale(Spring s, float factor) // 對 spring 的縮放

static Spring width(Component c) // 計算指定元件的寬度所表示的 spring

static Spring height(Component c) // 計算指定元件的高度所表示的 sprin

int   getValue()//對 spring 所表示的數值大小的獲取

void  setValue(int value) // 對 spring 所表示的數值大小的設定

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

import javax.swing.*;
import static javax.swing.SpringLayout.*;

public class t3 extends JFrame{
	
	public t3() {
		setTitle("Hern");
		setBounds(400, 400, 400, 400);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		SpringLayout springLayout = new SpringLayout();
		setLayout(springLayout);
		
		Spring vST = Spring.constant(20);// 建立一個支柱
		Spring hSP = Spring.constant(20, 100, 500);// 建立一個彈簧
		
		JButton lButton = new JButton("按鈕L");
		add(lButton);
		springLayout.putConstraint(NORTH, lButton, vST, NORTH,getContentPane());// “按鈕L”北側——>容器北側
		springLayout.putConstraint(WEST, lButton, hSP, WEST,getContentPane());// “按鈕L”西側——>容器西側
		
		JButton rButton = new JButton("按鈕R");
		add(rButton);
		springLayout.putConstraint(NORTH, rButton, 0, NORTH, lButton);// “按鈕R”北側——>“按鈕R”北側
		springLayout.putConstraint(WEST, rButton, Spring.scale(hSP, 2),EAST, lButton);// “按鈕R”西側——>“按鈕L”東側
		springLayout.putConstraint(EAST, getContentPane(), hSP, EAST,rButton);// 容器東側——>“按鈕R”東側
		
		setVisible(true);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		t3 test = new t3();

	}

}

利用彈簧控制組件大小

利用SpringLayout類的getConstraints(Component c)方法可以得到SpringLayout.Constraints類的物件,通過該類的方法setWidth(Spring width)setHeight(Spring height)可以為元件的寬度和高度新增約束。

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

import javax.swing.*;
import static javax.swing.SpringLayout.*;

public class t3 extends JFrame{
	
	public t3() {
		setTitle("Hern");
		setBounds(400, 400, 400, 400);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		SpringLayout springLayout = new SpringLayout();
		setLayout(springLayout);
		
		Spring vST = Spring.constant(20);// 建立一個支柱
		Spring hSP = Spring.constant(20, 100, 500);// 建立一個彈簧
		
		JButton lButton = new JButton("按鈕L");
		add(lButton);
		springLayout.putConstraint(NORTH, lButton, vST, NORTH,getContentPane());// “按鈕L”北側——>容器北側
		springLayout.putConstraint(WEST, lButton, hSP, WEST,getContentPane());// “按鈕L”西側——>容器西側
		
		JButton rButton = new JButton("按鈕R");
		add(rButton);
		springLayout.putConstraint(NORTH, rButton, 0, NORTH, lButton);// “按鈕R”北側——>“按鈕R”北側
		springLayout.putConstraint(WEST, rButton, Spring.scale(hSP, 2),EAST, lButton);// “按鈕R”西側——>“按鈕L”東側
		springLayout.putConstraint(EAST, getContentPane(), hSP, EAST,rButton);// 容器東側——>“按鈕R”東側
		
		Spring widthSP = Spring.constant(60, 300, 600);// 建立一個彈簧
		Spring heightST = Spring.constant(60);// 建立一個支柱
		
		Constraints lButtonCons = springLayout.getConstraints(lButton);// 獲得“按鈕L”的Constraints物件
		lButtonCons.setWidth(widthSP);// 設定控制組件寬度的彈簧
		lButtonCons.setHeight(heightST);// 設定控制組件高度的支柱
		
		Constraints rButtonCons = springLayout.getConstraints(rButton);// 獲得“按鈕R”的Constraints物件
		rButtonCons.setWidth(widthSP);// 設定控制組件寬度的彈簧
		rButtonCons.setHeight(heightST);// 設定控制組件高度的支柱
		
		setVisible(true);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		t3 test = new t3();

	}

}