傳統 GUI 程式碼混雜佈局、事件處理與業務邏輯,維護困難。聲明性 XML UI 僅描述「是什麼」(結構、屬性),不指定「如何做」(控制流),天然實現關注點分離,利於團隊協作與多視圖技術整合。
XUINode 樹,同步 XML 節點與 Swing 組件狀態<?xml version="1.0" encoding="UTF-8"?>
<xui:XUI xmlns:xui="https://xml.bcit.ca/PurnamaProject/2003/xui">
<xui:Window id="window_0" name="Hello World" width="300" height="300" x="426" y="282" visible="true">
<xui:GridLayout width="1" height="1"/>
<xui:Panel id="panel_0" x="0" y="0" width="1" height="1">
<xui:GridLayout width="1" height="1"/>
<xui:Button id="button_0" label="Press Me" enabled="true" orientation="horizontal"/>
</xui:Panel>
</xui:Window>
<xui:Resource type="java" class="ButtonModel" uri="model.jar"/>
</xui:XUI>
XUI:包含 0-128 個 Window 與 1 個 ResourceWindow:7 個必填屬性,包含 GridLayout、容器選擇組、可選 MenuBarPanel:中級容器,支援 15+ 原子組件 (Button, Table, Tree 等)xmlns:xui 避免元素名稱衝突XUIBuilder builder = XUIBuilderFactory.getInstance().getXUIBuilder(); // 1. 取得 Builder
builder.parse("browser.xml"); // 2. 驗證解析
XUI xui = builder.getXUIDocument(); // 3. 建立自定義 DOM
xui.visualize(); // 4/5. 實例化 GUI 組件樹
xui.bind(); // 6. 反射綁定業務模型 (Resource 指定 JAR 入口類)
xui.marshalXUI("output.xml"); // 額外:編組回 XML
XUINode 對應一個 XUIComponent,再對應一個 Swing PeerXUINode.toString())遞歸生成帶縮進、命名空間前綴的 XML 字串,支援巢狀結構序列化。
XUIWindow.addComponent)win.addChildNode(node)BindingFactory.doBinding)JarURLConnection + 自定義 XUIClassLoader 載入類init(XUI) 方法XUIResources 單例HypertextPane、導航按鈕、多對話框 (開啟/儲存/退出確認/書籤)MenuBar 整合快捷鍵 (Ctrl+X 退出、Ctrl+D 加書籤)HypertextPane 右鍵事件BrowserModel 實現public class BrowserModel implements ActionModel, TextModel, WindowModel, ListActionModel {
private XUI xui;
public void init(XUI document) {
xui = document;
// 透過 ID 取得組件
bookmarksList = (XUIList) xui.getXUIComponent("list_0");
homeButton = (XUIButton) xui.getXUIComponent("button_1");
// 動態建立書籤選單項並註冊監聽
for (String url : bookmarksList.getItems()) {
XUIMenuItem item = XUIComponentFactory.makeMenuItem(url);
bookmarksMenu.addMenuItem(item);
item.addEventListener(linkModel);
}
homeButton.addEventListener(this);
}
public void action(XUIComponent component) {
// 統一事件分發:導航、檔案操作、書籤、退出確認等
}
}
風險:Resource URI 任意載入 JAR,存在代碼注入風險。
對策:白名單限制 URI、數位證書驗證 JAR 來源。
擴展性:命名空間機制允許嵌入 SVG 等其他 XML 格式。
聲明性 XML UI + 反射綁定框架,實現了 UI 描述與業務邏輯的徹底解耦,促進重用與模組化。雖屬成熟技術領域,但在安全模型與工具鏈完善上仍有發展空間。