WindowBuilder的前身是Instantiations開發的SWT Designer,2010年8月初Google收購了Instantiations,之後重新發布了Instantiations的開發工具,並且對所有開發人員免費,其中就包括用於Java圖形界面設計的WindowBuilder。
WindowBuilder的下載方式見https://developers.google.com/java-dev-tools/download-wbpro?hl=zh-CN。安裝完成後,即可在File->New->Other...中看到WindowBuilder,如圖1所示。
圖1
在WindowBuilder下可以直接建立工程,也可以建立單個的窗口。假設已經建立了工程,這裏選擇Swing Designer下的Application Window,點擊Next >後,類似於新建類,在後續對話框中輸入Name和Package,如圖2所示。
圖2
Finish後,即可得到HelloWorld.java。打開HelloWorld.java,可見其中已經預先生成了一些代碼,是一個空白的窗體。點擊代碼窗口左下角新出現“Design"標籤,可以使用WindowBuilder Editor可視化地查看窗體(也可以在HelloWorld.java上點擊右鍵,選擇Open With->WindowBuilder Editor),如圖3所示。
圖3
WindowBuilder Eidtor的界面類似於VS等工具,能夠可視化地對界面進行設計。點擊Layouts下的Absolute layout,再點擊窗體,使用絕對定位;點擊Components下的JTextField,再點擊窗體,添加一個文本框,修改其Variable屬性爲”txtName“;點擊Components下的JButton,再點擊窗體,添加一個按鈕,修改其Variable屬性爲btnSubmit,修改其text屬性爲”Submit“;點擊Components下的JLabel,再點擊窗體,添加一個標籤,修改其Variable屬性爲lblName,修改其text屬性爲”Name:“;同樣方法再添加一個JLabel,修改其Variable屬性爲lblMessage,修改其text屬性爲”Please enter your name.“;調整界面尺寸,最終得到的界面如圖4所示。
圖4
這時點擊左下角的”Source“標籤回到代碼編輯器,可以看到WindowBuilder生成的代碼如下:
package text;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
public class HelloWorld {
private JFrame frame;
private JTextField txtName;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
HelloWorld window = new HelloWorld();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public HelloWorld() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 196, 169);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
txtName = new JTextField();
txtName.setBounds(57, 18, 93, 21);
frame.getContentPane().add(txtName);
txtName.setColumns(10);
JButton btnSubmit = new JButton("Submit");
btnSubmit.setBounds(57, 46, 93, 23);
frame.getContentPane().add(btnSubmit);
JLabel lblName = new JLabel("Name:");
lblName.setBounds(20, 21, 54, 15);
frame.getContentPane().add(lblName);
JLabel lblMessage = new JLabel("Please enter your name.");
lblMessage.setBounds(20, 79, 151, 15);
frame.getContentPane().add(lblMessage);
}
}
如果在點擊”Source“標籤前選中了某個組件,則點擊”Source“回到代碼編輯器後,光標則會自動定位到對應的組件。
再點擊”Design“回到WindowBuilder Editor,雙擊Submit按鈕,同大多數GUI開發工具類似,WindowBuilder認爲此時要編寫事件處理代碼,界面自動切換到代碼編輯器,且WindowBuilder已經在initialize()中完成了監聽器的定義和註冊:
btnSubmit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
}
});
WindowBuilder使用匿名內部類的形式實現事件處理器。修改initialize()如下:
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 196, 169);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
txtName = new JTextField();
txtName.setBounds(57, 18, 93, 21);
frame.getContentPane().add(txtName);
txtName.setColumns(10);
final JLabel lblMessage = new JLabel("Please enter your name.");
lblMessage.setBounds(20, 79, 151, 15);
frame.getContentPane().add(lblMessage);
JButton btnSubmit = new JButton("Submit");
btnSubmit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
lblMessage.setText("Hello " + txtName.getText() + "!");
}
});
btnSubmit.setBounds(57, 46, 93, 23);
frame.getContentPane().add(btnSubmit);
JLabel lblName = new JLabel("Name:");
lblName.setBounds(20, 21, 54, 15);
frame.getContentPane().add(lblName);
}
這裏將lblMessage的定義放在按鈕btnSubmit之前,並定義爲final(在匿名類內部使用外部定義的對象,則該對象必須爲final),運行結果如圖5所示。