Java 1.4 引入 SpringLayout,允許將「彈簧」附加到組件,使組件相對於其他組件或容器邊界佈局。例如按鈕始終依附右邊框,無論視窗寬度如何變化。
SpringLayout 透過 SpringLayout.Constraints 對象控制組件四邊(EAST, WEST, NORTH, SOUTH)。每條邊關聯一個 Spring 對象。可先添加組件再單獨設置約束。範例將標籤置於容器左上偏移 (5,25):
Component left = new JLabel("Left");
SpringLayout layout = new SpringLayout();
JPanel panel = new JPanel(layout);
Spring xPad = Spring.constant(5);
Spring yPad = Spring.constant(25);
SpringLayout.Constraints c = new SpringLayout.Constraints();
c.setConstraint(SpringLayout.WEST, xPad);
c.setConstraint(SpringLayout.NORTH, yPad);
contentPane.add(left, c);
添加第二個組件需參考第一個組件邊界。用 layout.getConstraint(SpringLayout.EAST, left) 獲取左組件右邊位置,加上間距作為右組件左邊:
Component right = new JTextField(15);
Spring rightSideOfLeft = layout.getConstraint(SpringLayout.EAST, left);
Spring pad = Spring.constant(20);
Spring leftEdgeOfRight = Spring.sum(rightSideOfLeft, pad);
c = new SpringLayout.Constraints();
c.setConstraint(SpringLayout.WEST, leftEdgeOfRight);
c.setConstraint(SpringLayout.NORTH, yPad);
contentPane.add(right, c);
組件多時上述方式繁瑣。putConstraint() 允許先加組件再統一設置約束,自動處理邊界計算與間距:
layout.putConstraint(SpringLayout.WEST, left, 5, SpringLayout.WEST, panel);
layout.putConstraint(SpringLayout.NORTH, left, 25, SpringLayout.NORTH, panel);
layout.putConstraint(SpringLayout.NORTH, right, 25, SpringLayout.NORTH, panel);
layout.putConstraint(SpringLayout.WEST, right, 20, SpringLayout.EAST, left);
參數:目標組件邊界、目標組件、間距(int 或 Spring)、參考組件邊界、參考組件。需確保參考組件位置可計算或固定(如容器邊界)。
Sun 提供 BeanBuilder 工具輔助 SpringLayout 設計。組件四邊各有小方框,拖曳連線即可生成 putConstraint() 代碼。圖示展示啟動畫面與設計畫面。

import java.awt.*;
import javax.swing.*;
public class SpringFormTest {
public static void main(String args[]) {
JFrame frame = new JFrame("Spring Form");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = frame.getContentPane();
SpringLayout layout = new SpringLayout();
contentPane.setLayout(layout);
Component left = new JLabel("Left");
Component right = new JTextField(15);
contentPane.add(left);
contentPane.add(right);
layout.putConstraint(SpringLayout.WEST, left, 10, SpringLayout.WEST, contentPane);
layout.putConstraint(SpringLayout.NORTH, left, 25, SpringLayout.NORTH, contentPane);
layout.putConstraint(SpringLayout.NORTH, right, 25, SpringLayout.NORTH, contentPane);
layout.putConstraint(SpringLayout.WEST, right, 20, SpringLayout.EAST, left);
frame.setSize(300, 100);
frame.show();
}
}
