HOWTO · Java
Java Swing 應用程式的最佳 GUI 構建器
比較 Java Swing 應用程式的兩種經典 GUI 構建器:Eclipse 中的 WindowBuilder 和 Apache NetBeans 內置的 GUI 構建器 — 如何安裝 WindowBuilder,以及如何在每個工具中開始一個 Swing 表單。
本頁內容
一個好的 GUI 構建器讓您以視覺方式設計視窗 — 透過拖放放置元件、在工作時預覽佈局,並讓工具生成樣板程式碼 — 而不必手寫每一行佈局程式碼。對於 Java Swing,兩個經典選擇是 WindowBuilder(一個 Eclipse 外掛)和 Apache NetBeans 內置的 GUI 構建器。
在本文中,我們首先看看為什麼使用 Swing 以及它的類是如何組織的。然後我們在 Eclipse 中安裝 WindowBuilder 並用它建立一個 Swing 視窗,最後用 NetBeans GUI 構建器做同樣的事情。
為什麼我們使用 Java Swing
Swing 是在 Java 中建構基於視窗的桌面應用程式的標準工具包。它隨 Java 平台本身一起提供,是開源的,並提供一整套元件 — 按鈕、清單、文字欄位、表格等等 — GUI 構建器可以將它們放置在表單上並為其生成程式碼。
Java Swing 類的分類
為了更清楚地理解 Java Swing,請看下圖。
圖摘要:
該圖描繪了頂部的一個 Java 物件與底部的一個 JFrame 之間的關係。
您經常與之互動的幾乎每個元件 — 清單、按鈕、文字欄位等等 — 都繼承自 JComponent 類,而它本身又源自 AWT 的 Container 和 Component 類。頂層容器是個例外:JFrame 和 JDialog 擴充的是 AWT 視窗類(Frame 和 Dialog),而不是 JComponent,因為它們是作業系統管理的視窗。
所有關鍵的 Swing 元素都包含在圖形使用者介面應用的基礎之中。
Windows Builder Eclipse 外掛
WindowBuilder 是一個 Eclipse 外掛,它將 SWT Designer 和 Swing Designer 整合到一個套件中。它的所見即所得視覺化設計器提供佈局工具,可以建立從簡單表單到複雜視窗的任何東西:您透過拖放新增控制項,在屬性編輯器中編輯它們的屬性,並連接事件處理,而 WindowBuilder 為您生成相應的程式碼。
Windows Builder 外掛:
按以下步驟操作:
-
安裝:WindowBuilder
-
新增至 Eclipse(拖放):
-
確認安裝過程:
從 Eclipse Marketplace 安裝 Windows Builder 外掛
上面的拖放安裝是最快的途徑。您也可以透過更新機制從 Eclipse 內部安裝 WindowBuilder:
您必須啟動 Eclipse 並查看它是什麼版本。
-
然後轉到
Help。 -
選擇
Install New Software。 -
搜尋您的 Eclipse 版本。
-
按一下
General Purpose Tools。 -
勾選您要安裝的所有 Windows Builder 功能。
-
勾選所有選項後,確認並等待安裝過程完成。
-
安裝完成後不要忘記重啟 Eclipse。
使用 Windows Builder 進行 Swing GUI 開發
安裝 WindowBuilder 後,像這樣建立一個 Swing 應用程式視窗:
執行以下步驟:
-
轉到
File。 -
選擇
New。 -
Other -
搜尋
WindowBuilder=>Swing Designer=>Application Window。
新類將在 WindowBuilder 設計視圖中開啟,您可以在其中以視覺方式建構視窗,並切換到原始碼視圖檢視生成的程式碼。
NetBeans Java Swing GUI 構建器
NetBeans GUI 構建器支援製作複雜而優雅的圖形使用者介面應用程式,並且它內置於 IDE 中 — 無需額外安裝。您也不需要深入的佈局管理專業知識:該構建器使用 GroupLayout 管理器,並在您放置元件時引導對齊。
這個 IDE 提供什麼?
- 開源
- 佈局管理
- 基於容器的輕量級開發
- 可用空佈局
- 強大的自訂
- 拖放功能
- 易於使用
首先,如果您還沒有,您需要下載 Apache NetBeans IDE。
-
下載:NetBeans
-
下載後,啟動並建立一個新專案。
-
之後,鍵入您的專案名稱並完成。
-
建立新專案後,您需要建立一個類。右鍵按一下您的專案 >
new>JFrame Form。
JFrame Form(而非普通類)正是開啟視覺化設計器的原因;NetBeans 將在完成它後動態生成以下程式碼。public class Demo2 extends javax.swing.JFrame {
public Demo2() {
initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE));
layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 300, Short.MAX_VALUE));
pack();
} // </editor-fold>
public static void main(String args[]) {
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
try {
for (javax.swing.UIManager.LookAndFeelInfo info :
javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(Demo2.class.getName())
.log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(Demo2.class.getName())
.log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(Demo2.class.getName())
.log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(Demo2.class.getName())
.log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Demo2().setVisible(true);
}
});
}
}
生成的類是一個完整、可執行的 JFrame:受保護的 initComponents() 區塊由構建器在您設計時維護,main 方法設定 Nimbus 外觀(如果可用)並顯示表單。您在視覺化編輯器中設計,讓 NetBeans 保持這段程式碼同步。
這兩個構建器都生成普通的 Swing 程式碼,因此它們之間的選擇主要是 IDE 的選擇:如果您在 Eclipse 中工作,就用 WindowBuilder;如果您在 NetBeans 中工作,就用內置的構建器。無論哪種方式,您都會得到一個視覺化設計器、拖放式元件放置,以及您仍然可以閱讀和手動調整的生成程式碼。