很多初學者在用Java布局器自動布局畫界面時,經常遇見不知道如何定義區域大小或按鈕之間的距離等問題。我寫過一篇《實現JAVA手動布局中各個組件能隨窗口變化的方法》的文章,有讀者反映算坐標不好算,問能不能用布局器實現文章中的界面。
<!-- frame contents -->
<!-- /frame contents -->
其實自動布局也可以解決定義區域大小或按鈕之間的距離等問題,只是沒有手動布局那麼靈活。下面我就舉一個例子。
首先,建一個frame文件(Application應用程序),在Design中將this中的layout設置為BorderLayout。
第二,在組件盤內點選Swing Container頁簽,選取Jpanel圖標,在this中上方拖拽一塊區域,布局器會自動調整位置與大小;同樣的方法在中下方也拖拽一塊區域;在Swing Container頁簽,選取jScrollPane圖標,將jScrollPane在中間拖拽一塊區域。拖拽的順序一定要先上後下再中間。為了方便區分,在Properties的background中,將上方的Jpanel1區域設置為紅色,下方的Jpanel2區域設置為橙色,中間的jScrollPane1為粉紅色。將Jpanel1和Jpanel2的layout設置為flowLayout(必須要手動設置,不要采用默認值)。
第三,在Jpanel中放入一個Jlable標題欄,JTextField1文本框和Jbutton按鈕,在組件盤內點選Swing 頁簽,選取JLable圖標在Jpanel1的中畫一個標題欄,將text改為“請輸入查詢條件”,再選取JtextField在Jpanel1中畫一個文本框,將text改為空,最後選取Jbutton在Jpanel1中再畫一個按鈕將text改為“查詢”。畫完後他們都是在中間,而且大小固定,這時點選Jpanel的flowLayout1將右邊Properties中的alignment設置為LEFT,這時Jpanel1中的組鍵就會向左排列。選中其中一個組鍵,在Properties中的preferredSize可以設置組鍵的寬和高。同樣的方法在Jpanel2中畫三個Jbutton按鈕,將text分別設為“增加”、“刪除”、“修改”。點選Jpane2的flowLayout2將右邊Properties中的hgap設置為30(按鈕的間距,可根據自己的需要調整數值大小), 這樣就調整了三個按鈕之間的距離,設置vgap還可以改變Jpane2區域的高度。
第四,在jScrollPane1中建一個表格用來顯示數據庫數據的內容,在組件盤內點選Swing 頁簽,選取JTable圖標,將Jtable加入到jScrollPane1中。
最後,將this中的defaultCloseOperation改為EXIT_ON_CLOSE,這樣在關閉窗口時程序會自動退出。
程序源代碼如下(除中文注釋部分的兩句是自己加上去,其余是自動生成):
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
public class Frame1
extends JFrame {
BorderLayout borderLayout1 = new BorderLayout();
JPanel jPanel1 = new JPanel();
JPanel jPanel2 = new JPanel();
JPanel jPanel3 = new JPanel();
JLabel jLabel1 = new JLabel();
JTextField jTextField1 = new JTextField();
JButton jButton1 = new JButton();
FlowLayout flowLayout1 = new FlowLayout();
FlowLayout flowLayout2 = new FlowLayout();
JButton jButton2 = new JButton();
JButton jButton3 = new JButton();
JButton jButton4 = new JButton();
GridLayout gridLayout1 = new GridLayout();
JScrollPane jScrollPane1 = new JScrollPane();
JTable jTable1 = new JTable();
public Frame1() {
try {
jbInit();
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Frame1 frame1 = new Frame1();
frame1.setSize(new Dimension(400, 350));
frame1.show();
}
private void jbInit() throws Exception {
this.getContentPane().setLayout(borderLayout1);