程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java布局管理器在現實工程中的應用

Java布局管理器在現實工程中的應用

編輯:關於JAVA

內容簡介:Java的出現是編程藝術和計算環境改變的結果,是Intenet發展的產物同時也是推動Internet發展的動力。但是Java作為新的編程語言,有許多不與以往編程語言不同的地方。布局管理就是其中的一個,本文的目的在於介紹如何將布局管理應用於現實工程中,而不是作為學習布局管理的參考資料。

布局管理對於眾多編程人員來說是一個比較新的概念,因為以前使用的多種編程工具已經很好地解決了這個問題,根本就不用程序員自己考慮控件的布局問題,只需要簡單的拖拽就可。但是接觸到java之後,尤其是因為使用elipse等工具,就不得不認真地對待這個布局問題。而且我個人認為使用elipse這種工具開發也有它的長處,優點之一就是就是可以使開發者真正的在開發過程中思考每一個類的結構,可以使代碼更加的優秀,同時也使一個程序員更容易向一個程序設計人員轉變。

由於本文的目的在於介紹布局管理在現實工程中的應用,關於布局管理的基本內容,這裡不再介紹,並把讀者定位於已經基本了解布局管理的使用方法的程序員,沒有掌握布局管理基礎知識的讀者可以參考sun提供的java api。

開始接觸布局管理的程序員可能會感覺布局管理比較難於對付,增加了開發人員對商業邏輯考慮之外的負擔,這個的確是事實,但是遠不如剛接觸不覺布局管理的人想象得那麼難。因為從工程角度考慮的話,一個用戶界面的並非十分的復雜,當然我是指的一般的數據庫應用程序,界面極其復雜的工具類軟件。一般來說數據庫應用程序的主要應用在於對數據庫的維護,回想我們以前從事過的工程,用戶界面基本上由菜單,數據列表,數據編輯組件,一組用來提交用戶工作的按鈕組成。以下內容就以上述組件作為一個數據庫應用程序的用戶界面為基礎展開討論。

首先我們把這些窗體內容分組,然後把每一組組件放在一個容器中(這是我以往的開發過程中處理用戶界面的方法,個人認為可以簡化用戶界面的開發),這樣我們就把以上組件劃分為兩組(菜單不再布局考慮之內)即數據組件和按鈕,然後我們在把數據組件分成數據列表,數據編輯組件分成兩組,將以上個組分別放置在各自的容器中,使用程序表達出如下:

JFrame sampleFrame = new JFrame("Sample Frame for Manager Layout");
JPanel panelDataContent = new JPanel(); // 數據組件容器
JPanel panelDataList = new JPanel(); // 數據列表容器
JList listData = new JList();
/*
注釋1 這裡應該是使用布局管理把listData放在panelDataList上
*/
JPanel panelDataEditor = new JPanel(); // 數據編輯組件容器
JTextField editData1 = new JTextField();
//...... // some other edit controls
/*
注釋2 這裡應該是使用布局管理把數據編輯組件放在panelDataEditor上
*/
/*
注釋3 這裡應該是使用布局管理器把panelDataList和panelDataEditor放在
panelDataContent上
*/
JPanel panelButton = new JPanel(); // 按鈕容器
JButton buttonModify = new JButton("Modify");
//...... //some other buttons
/*
注釋4 這裡應該是使用布局管理器把按鈕放在panelButton上
*/
Container c = sampleFrame.getContentPane();
/*
注釋5 這裡應該是使用布局管理器把panelButton和panelDataContent放在c上
*/

這樣的話,我們在開始考慮布局的時候就可以考慮把一個窗體分為兩部分。這樣我們就有兩種結構可以選擇,上下結構和左右結構。下面我們來先考慮上下結構。

以我個人的審美觀點和便利性角度的考慮,我會選擇把panelButton放在下面,同時我們應該考慮到panelDataContent應該占據除了panelButton之外所有sampleFrame空間,就像是在使用Delphi是我們將一個TPanel的實例的align設置成alClient。這樣BorderLayout就成為c的布局管理器。因為在BorderLayout中,如果使用BorderLayout.

CENTER的方式則達到這種目的。那麼panelButton則應該使用BorderLayout.SOURTH的方式布局。於是產生了一下代碼

c.setLayout(new BorderLayout());//這一句可以省略,因為frame的默認布局是
Borderlayout。
c.add(panelDataContent,BorderLayout.CENTER);
c.add(panelButton,BorderLayout.SOUTH);

我們只需把以上的代碼代替注釋5,就實現了第一次分組的布局。接著我們是用同樣的布局管理來實現第二次分組,也就是數據組件的分組。

panelDataContent.setLayout(new BorderLayout());//不可省略,JPanel的默認布局是
FlawLayout。
panelDataContent.add(panelDataList,BorderLayout.CENTER);
panelDataContent.add(panelDataEditor,BorderLayout.SOUTH);

將以上代碼代替注釋3的位置即可。

下面我們來分別處理三個JPanel(panelDataList,panelDataEditor,panelButton)上的控件的布局。

在處理這個問題之前我也揭示(不是解釋)一點java布局管理對空間大小的影響,這裡我不用“解釋”的原因在於我只是了解到這一點,而沒有深入的研究原理何在。FlowLayout保持由他管理的容器上的控件的大小(應該是preferred size),GridLayout從來不理會這些空間的大小,只是把控件完全填充由GridLayout劃分的格子但是我們應該注意到GridLayout講一個容器劃分成等面積大小的格子,一次不適合我們以上的應用)。而BorderLayout對空間的控制介於以上兩者之間。BorderLayout使放在NORTH和SOURTH的控件保持合適的高度,是放置在EAST和WEST的控件保持合適的寬度,使放在CENTER的控件占據剩余的所有空間。

這樣一來對於dataList的放置我們有兩種一種是使用BorderLayout布局管理,把dataList放在BorderLayout.CENTER的位置,一種是使用GridLayout把panelDataList劃分一個格子。事實也是如此。開發者可以根據自己的喜好從這兩種布局中選出一種。

//panelDataList.setLayout(new BorderLayout());
//panelDataList.add(listData,BorderLayout.CENTER);
panelDataList.setLayout(new GridLayout(1,1));
panelDataList.add(listData);

至於panelButton的布局格式因該選擇FlowLayout,也許有的讀者會提出為什麼不選擇GridLayout,因為如果使用這種布局方法,地區可以保證按鈕全部在一排,但是當用戶改變窗體大小時,會出現按鈕過長或過短的情形。但是使用FlowLayout的缺點在於用戶使寬度小於按鈕的寬度和時,會使一些按鈕不可見。

panelButton.setLayout(new FlowLayout());//可以省略。因為FlowLayout時JPanel的

默認布局方式

panelButton.add(buttonNew);

對於panelDataEditor的布局管理,需要根據不同的情況來進行判斷處理,而我認為最佳的選擇時GridBagLayout。當然如果排放的空間相當簡單,使用GridBagLayout反而體現不出它的優越性。由於這一部分的隨機性,這裡不再介紹。一下使我在寫這樣文章時的全部代碼,提供給大家以供參考。

/*
* Created on 2003-7-14
*/
import javax.swing.*;
import java.awt.*;
/**
* @author idilent
* Supporting the paper which name is "java布局管理器在現實工程中的應用"
*/
public class LayoutSample {
public static void main(String[] args) {
JFrame sampleFrame = new JFrame("Sample Frame for Manager
Layout");
JPanel panelDataContent = new JPanel(); // 數據組件容器
JPanel panelDataList = new JPanel(); // 數據列表容器
JList listData = new JList();
//這裡可以使用兩種方案
//panelDataList.setLayout(new BorderLayout());
//panelDataList.add(listData,BorderLayout.CENTER);
panelDataList.setLayout(new GridLayout(1,1));
panelDataList.add(listData);
/*
注釋1 這裡應該是使用布局管理把listData放在panelDataList上
*/
JPanel panelDataEditor = new JPanel(); // 數據編輯組件容器
JTextField editData1 = new JTextField(20);
panelDataEditor.add(editData1);
// ...... // some other edit controls
/*
注釋2 這裡應該是使用布局管理把數據編輯組件放在panelDataEditor

*/
/*
注釋3 這裡應該是使用布局管理器把panelDataList和
panelDataEditor放在
panelDataContent上
*/
panelDataContent.setLayout(new BorderLayout());//不可省略,
JPanel的默認布局是FlawLayout。
panelDataContent.add(panelDataList,BorderLayout.CENTER);
panelDataContent.add(panelDataEditor,BorderLayout.SOUTH);
JPanel panelButton = new JPanel(); // 按鈕容器
JButton buttonNew = new JButton("New");
JButton buttonModify = new JButton("Modify");
JButton buttonDelete = new JButton("Delete");
JButton buttonSave = new JButton("Save");
// ...... //some other buttons
/*
注釋4 這裡應該是使用布局管理器把按鈕放在panelButton上
*/
panelButton.add(buttonNew);
panelButton.add(buttonModify);
panelButton.add(buttonDelete);
panelButton.add(buttonSave);
Container c = sampleFrame.getContentPane();
/*
注釋5 這裡應該是使用布局管理器把panelButton和panelDataContent
放在c上
*/
c.setLayout(new BorderLayout());
//這一句可以省略,因為frame的默認布局是Borderlayout。
c.add(panelDataContent,BorderLayout.CENTER);
c.add(panelButton,BorderLayout.SOUTH);
sampleFrame.setSize(300,300);//不使用pack()的原因是,使JList
顯示
sampleFrame.show();
}
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved