BiDi(雙向文字)支援是軟體進軍中東市場的門檻。阿拉伯文、希伯來文從右向左(RTL),夾雜英文/數字從左向右(LTR),瀏覽器與作業系統已處理輸入順序,但 Java UI 框架仍需開發者顯式啟用與微調。
ComponentOrientationgetOrientation(Locale):依區域取得全域方向isLeftToRight():判斷當前方向LEFT_TO_RIGHT、RIGHT_TO_LEFTComponent.applyComponentOrientation(orientation):遞套套用至子元件AWT 仰賴作業系統原生繪製,BiDi 表現不穩、元件佈局缺陷多;Swing 純 Java 實作,跨平台一致、BiDi 支援完整。**請務必使用 Swing。**
public class BiDiApp extends JFrame {
public BiDiApp() {
applyComponentOrientation(
ComponentOrientation.getOrientation(Locale.getDefault())
);
}
}
英文區跑 LTR,阿拉伯區自動變 RTL:選單、工具列、捲軸、游標全翻轉。

| 元件 | 問題 | 修正 |
|---|---|---|
JFrame | 標題列不翻轉 | if (!orientation.isLeftToRight()) JFrame.setDefaultLookAndFeelDecorated(true);(代價:失去原生視窗風格) |
Box | applyComponentOrientation 不遞套 | 建構時用 new Box(BoxLayout.LINE_AXIS),LINE_AXIS 會依方向自動切換水平軸 |
JComboBox | 下拉項目文字靠左 | ((JLabel)box.getRenderer()).setHorizontalAlignment(SwingConstants.RIGHT); |
JTable | 儲存格文字靠左 | ((JLabel)table.getDefaultRenderer(String.class)).setHorizontalAlignment(JLabel.RIGHT); |

SwingConstants.LEADING、TRAILING 會依 ComponentOrientation 自動對應「行首/行尾」,相容 LTR/RTL 切換。嚴禁硬編碼 LEFT/RIGHT,否則覆蓋全域方向。
SWT 封裝原生元件,BiDi 邏輯內建於控件。只需啟動時設定 RTL 區域,應用程式自動呈現鏡像介面,開發者無需額外代碼。

標點屬「弱字元」,方向由鄰近「強字元」或全域方向決定。阿拉伯資源 "URL \u0644\u0637\u0644\u0628 UDDI:" 顯示時冒號跑到右邊、英文倒序。
修正:RTL 環境前加 \u200F (LRM) 強制 LTR 片段方向。
String text = "URL \u0644\u0637\u0644\u0628 UDDI:";
if (!orientation.isLeftToRight()) text = "\u200F" + text;
new JLabel(text, SwingConstants.LEADING);

這類技術字串在任何語系下都應保持原序。檢測顯示異常時,在字串前加 \u200E (RLM) 或 \u200F (LRM) 強制方向。

掌握 ComponentOrientation、修正四大 Swing 元件、善用 LEADING/TRAILING、靈活插入 LRM/RLM、建立「資源驗證基準流程」,Java BiDi 國際化不再是黑盒。