首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

SWT/JFace 佈局管理器詳解:RowLayout 參數配置與動態增減元件實戰

     編輯:Java 相關知識

RowLayout 簡介

RowLayout 是比 FillLayout 更靈活的佈局管理器。它將子元件按順序排列成行(水平)或列(垂直),支援換行、元件保持原始大小、邊距、間距等細節控制,適合工具列、表單欄位、按鈕群組等場景。

核心屬性詳解

屬性類型預設說明
typeintSWT.HORIZONTAL排列方向:SWT.HORIZONTAL(行)或 SWT.VERTICAL(列)
wrapbooleantrue空間不足時是否換行/換列
packbooleantruetrue=元件保持原始大小;false=元件填滿可用空間(均分)
justifybooleanfalsetrue=元件在單元格內拉伸填滿(需 pack=false 才生效)
marginLeft/Right/Top/Bottomint3容器四邊留白(像素)
spacingint3元件之間間距(像素)

RowData:單一元件尺寸控制

透過 control.setLayoutData(new RowData(width, height)) 指定特定元件寬高(像素),width/height = SWT.DEFAULT 表示使用元件建議尺寸。

範例一:基本 RowLayout 配置

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)

展示在執行期動態加入按鈕至巢狀 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();

關鍵 API 差異

方法用途參數 true 效果
Composite.layout(boolean)觸發佈局管理器重新排列子元件同時重新佈局所有子孫元件(遞迴)
Composite.pack()將容器調整為能容納所有子元件的最小尺寸無參數版本
Shell.pack(boolean)調整視窗大小true=包含子元件建議尺寸;false=僅依視窗本身

進階技巧與常見坑

  1. pack=true 時 justify 無效: 若希望元件拉伸填滿,必須設定 pack=false,否則元件堅持原始大小,justify 無施展空間。
  2. wrap=false 且水平排列: 元件會超出容器右邊界(需搭配捲動或固定視窗寬度)。
  3. 垂直排列時 spacing 僅影響垂直間距: 水平間距固定為 0(元素靠左對齊)。
  4. 動態增減元件必須呼叫 layout(): 否則新元件不會顯示或位置錯誤;若容器尺寸需變化再呼叫 pack()。
  5. 巢狀佈局傳播: 子 Composite 變大可能撐大父容器,需由內而外依序 layout(true) → pack()。

RowLayout vs FillLayout vs GridLayout

特性FillLayoutRowLayoutGridLayout
元件尺寸控制無(均分)RowData 指定 / 建議尺寸GridData 精細控制(跨列/跨行/對齊/搶佔空間)
換行支援無wrap 屬性numColumns 固定欄數,自動換行
對齊方式填滿靠左/靠上(預設)BEGINNING/CENTER/END/FILL 四向對齊
適用場景單一元件填滿、簡單均分工具列、按鈕群、簡單表單複雜對話框、精細對齊、響應式佈局

總結

RowLayout 以「行/列流式排列」為核心,提供換行、保持原始大小、固定尺寸、邊距間距等實用功能。掌握 pack/wrap/justify 三大開關與 RowData、動態佈局重算(layout/pack)技巧,即可靈活應對大多數中等複雜度的 UI 排版需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved