RowLayout 是比 FillLayout 更靈活的佈局管理器。它將子元件按順序排列成行(水平)或列(垂直),支援換行、元件保持原始大小、邊距、間距等細節控制,適合工具列、表單欄位、按鈕群組等場景。
| 屬性 | 類型 | 預設 | 說明 |
|---|---|---|---|
type | int | SWT.HORIZONTAL | 排列方向:SWT.HORIZONTAL(行)或 SWT.VERTICAL(列) |
wrap | boolean | true | 空間不足時是否換行/換列 |
pack | boolean | true | true=元件保持原始大小;false=元件填滿可用空間(均分) |
justify | boolean | false | true=元件在單元格內拉伸填滿(需 pack=false 才生效) |
marginLeft/Right/Top/Bottom | int | 3 | 容器四邊留白(像素) |
spacing | int | 3 | 元件之間間距(像素) |
透過 control.setLayoutData(new RowData(width, height)) 指定特定元件寬高(像素),width/height = SWT.DEFAULT 表示使用元件建議尺寸。
RowLayout rowLayout = new RowLayout();
// rowLayout.type = SWT.VERTICAL;
// rowLayout.wrap = false;
// rowLayout.pack = false;
// rowLayout.justify = true;
shell.setLayout(rowLayout);
Button button1 = new Button(shell, SWT.PUSH);
button1.setText("button1");
button1.setLayoutData(new RowData(100, 35)); // 固定 100x35
List list = new List(shell, SWT.BORDER);
list.add("item 1"); list.add("item 2"); list.add("item 3");
// List 無 RowData,使用建議尺寸
Button button2 = new Button(shell, SWT.PUSH);
button2.setText("button #2");
// 無 RowData,使用建議尺寸
shell.pack(); shell.open();
觀察重點: button1 固定大小,list 與 button2 依內容決定大小,皆受 pack=true 影響保持原始尺寸,水平排列並換行。
展示在執行期動態加入按鈕至巢狀 Composite,並即時重新佈局。
shell.setLayout(new RowLayout());
final Composite composite = new Composite(shell, SWT.BORDER);
composite.setLayout(new RowLayout());
composite.setBackground(display.getSystemColor(SWT.COLOR_YELLOW));
composite.addControlListener(new ControlListener() {
public void controlResized(ControlEvent e) { System.out.println("Composite resize."); }
public void controlMoved(ControlEvent e) {}
});
Button buttonAdd = new Button(shell, SWT.PUSH);
buttonAdd.setText("Add new button");
buttonAdd.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button btn = new Button(composite, SWT.PUSH);
btn.setText("Button #" + (count++));
composite.layout(true); // 重新計算 composite 內部佈局
composite.pack(); // 調整 composite 大小以容納新元件
shell.layout(true); // 重新計算 shell 佈局
shell.pack(true); // 調整 shell 大小(true=考慮子元件建議尺寸)
}
});
shell.pack(); shell.open();
| 方法 | 用途 | 參數 true 效果 |
|---|---|---|
Composite.layout(boolean) | 觸發佈局管理器重新排列子元件 | 同時重新佈局所有子孫元件(遞迴) |
Composite.pack() | 將容器調整為能容納所有子元件的最小尺寸 | 無參數版本 |
Shell.pack(boolean) | 調整視窗大小 | true=包含子元件建議尺寸;false=僅依視窗本身 |
pack=false,否則元件堅持原始大小,justify 無施展空間。layout(true) → pack()。| 特性 | FillLayout | RowLayout | GridLayout |
|---|---|---|---|
| 元件尺寸控制 | 無(均分) | RowData 指定 / 建議尺寸 | GridData 精細控制(跨列/跨行/對齊/搶佔空間) |
| 換行支援 | 無 | wrap 屬性 | numColumns 固定欄數,自動換行 |
| 對齊方式 | 填滿 | 靠左/靠上(預設) | BEGINNING/CENTER/END/FILL 四向對齊 |
| 適用場景 | 單一元件填滿、簡單均分 | 工具列、按鈕群、簡單表單 | 複雜對話框、精細對齊、響應式佈局 |
RowLayout 以「行/列流式排列」為核心,提供換行、保持原始大小、固定尺寸、邊距間距等實用功能。掌握 pack/wrap/justify 三大開關與 RowData、動態佈局重算(layout/pack)技巧,即可靈活應對大多數中等複雜度的 UI 排版需求。