Java圖形用戶界面設計
前言
隨著Internet的飛速發展,Java技術也得到了越來越廣泛的應用。而無論我們是采用J2SE、J2EE還是J2ME,GUI都是不能回避的問題。現在的應用軟件越來越要求界面友好、功能強大而又使用簡單。而眾所周知,在Java中進行GUI設計相對于其跨平臺、多線程等特性的實現要復雜和麻煩許多。這也是很多Java程序員抱怨的事情。但GUI已經成為程序發展的方向,所以我們也必須了解Java的GUI設計方法和特點。其實,采用Java提供的布局管理器接口和相應的布局管理類,我們也可以做出相當漂亮的界面來,當然實現起來肯定要比VB麻煩許多。本文試圖通過自己的開發經歷介紹一些具體的應用實例,希望能給那些曾經象我一樣苦悶的Java癡迷者一些幫助。
Java中的布局管理器
為什么要使用布局
在實際編程中,我們每設計一個窗體,都要往其中添加若干組件。為了管理好這些組件的布局,我們就需要使用布局管理器。比如說,設計一個簡單的計算器,或一個文本編輯器等等。這些組件是讓JVM 自己任意安排呢?還是按照一定的位置關系進行規范的安排呢?當然應該選擇后者。將加入到容器的組件按照一定的順序和規則放置,使之看起來更美觀,這就是布局。在Java中,布局由布局管理器 (LayoutManager) 來管理。那么,我們在什么時候應該使用布局管理器?應選擇哪種布局管理器?又該怎樣使用布局管理器呢?
如果你寫的是GUI程序,在使用AWT/Swing組件時就不應硬性設置組件的大小和位置,而應該使用Java的布局管理器(LayoutManager)來設置和管理可視組件的大小和位置,否則就有可能造成布局混亂。不信,你可以新建一個Frame(或JFrame),通過setBounds()方法往其中添加幾個Button(或JButton),一旦你將窗體拉大或縮小時,你會發現組件的排列完全不是按你所預想的那樣。為了解決這個問題,即當窗體(或容器)縮放時,組件位置也隨之合理調整,我們就需要使用布局管理器。
為此,我們首先要知道Java的布局方式,Java提供的API中有些什么布局管理器,它們的布局特點是什么。
Java的布局方式
我們都知道,Java的GUI界面定義是由AWT類包和Swing類包來完成的。它在布局管理上采用了容器和布局管理分離的方案。也就是說,容器只管將其他組件放入其中,而不管這些組件是如何放置的。對于布局的管理交給專門的布局管理器類(LayoutManager)來完成。
現在我們來看Java中布局管理器的具體實現。我們前面說過,Java中的容器類(Container),它們只管加入組件(Component),也就是說,它只使用自己的add()方法向自己內部加入組件。同時他記錄這些加入其內部的組件的個數,可以通過container.getComponentCount()方法類獲得組件的數目,通過container.getComponent(i)來獲得相應組件的句柄。然后LayoutManager類就可以通過這些信息來實際布局其中的組件了。
Java已經為我們提供了幾個常用的布局管理器類,例如: FlowLayout、BorderLayout、GridLayout、GridBagLayout等。下面列表說明它們的布局特點:
包類特點
java.awt CardLayout 將組件象卡片一樣放置在容器中,在某一時刻只有一個組件可見
java.awt FlowLayout 將組件按從左到右而后從上到下的順序依次排列,一行不能放完則折到下一行繼續放置
java.awt GridLayout 形似一個無框線的表格,每個單元格中放一個組件
java.awt BorderLayout 將組件按東、南、西、北、中五個區域放置,每個方向最多只能放置一個組件
java.awt GridBagLayout 非常靈活,可指定組件放置的具體位置及占用單元格數目
Javax.swing BoxLayout 就像整齊放置的一行或者一列盒子,每個盒子中一個組件
Javax.swing SpringLayout 根據一組約束條件放置子組件
Javax.swing ScrollPaneLayout 專用于JScrollPane,含一個Viewport,一個行頭、一個列頭、兩個滾動條和四個角組件
Javax.swing OverlayLayout 以彼此覆蓋的形式疊置組件
Javax.swing ViewportLayout JViewport的默認布局管理器
事實上,在大多數情況下,綜合運用好這些布局管理器已可以滿足需要。當然對于特殊的具體應用,我們可以通過實現LayoutManager或LayoutManager2接口來定義自己的布局管理器。下面我們通過幾個實例來了解幾個常用的布局管理器的使用方法。
隨著Internet的飛速發展,Java技術也得到了越來越廣泛的應用。而無論我們是采用J2SE、J2EE還是J2ME,GUI都是不能回避的問題。現在的應用軟件越來越要求界面友好、功能強大而又使用簡單。而眾所周知,在Java中進行GUI設計相對于其跨平臺、多線程等特性的實現要復雜和麻煩許多。這也是很多Java程序員抱怨的事情。但GUI已經成為程序發展的方向,所以我們也必須了解Java的GUI設計方法和特點。其實,采用Java提供的布局管理器接口和相應的布局管理類,我們也可以做出相當漂亮的界面來,當然實現起來肯定要比VB麻煩許多。本文試圖通過自己的開發經歷介紹一些具體的應用實例,希望能給那些曾經象我一樣苦悶的Java癡迷者一些幫助。
Java中的布局管理器
為什么要使用布局
在實際編程中,我們每設計一個窗體,都要往其中添加若干組件。為了管理好這些組件的布局,我們就需要使用布局管理器。比如說,設計一個簡單的計算器,或一個文本編輯器等等。這些組件是讓JVM 自己任意安排呢?還是按照一定的位置關系進行規范的安排呢?當然應該選擇后者。將加入到容器的組件按照一定的順序和規則放置,使之看起來更美觀,這就是布局。在Java中,布局由布局管理器 (LayoutManager) 來管理。那么,我們在什么時候應該使用布局管理器?應選擇哪種布局管理器?又該怎樣使用布局管理器呢?
如果你寫的是GUI程序,在使用AWT/Swing組件時就不應硬性設置組件的大小和位置,而應該使用Java的布局管理器(LayoutManager)來設置和管理可視組件的大小和位置,否則就有可能造成布局混亂。不信,你可以新建一個Frame(或JFrame),通過setBounds()方法往其中添加幾個Button(或JButton),一旦你將窗體拉大或縮小時,你會發現組件的排列完全不是按你所預想的那樣。為了解決這個問題,即當窗體(或容器)縮放時,組件位置也隨之合理調整,我們就需要使用布局管理器。
為此,我們首先要知道Java的布局方式,Java提供的API中有些什么布局管理器,它們的布局特點是什么。
Java的布局方式
我們都知道,Java的GUI界面定義是由AWT類包和Swing類包來完成的。它在布局管理上采用了容器和布局管理分離的方案。也就是說,容器只管將其他組件放入其中,而不管這些組件是如何放置的。對于布局的管理交給專門的布局管理器類(LayoutManager)來完成。
現在我們來看Java中布局管理器的具體實現。我們前面說過,Java中的容器類(Container),它們只管加入組件(Component),也就是說,它只使用自己的add()方法向自己內部加入組件。同時他記錄這些加入其內部的組件的個數,可以通過container.getComponentCount()方法類獲得組件的數目,通過container.getComponent(i)來獲得相應組件的句柄。然后LayoutManager類就可以通過這些信息來實際布局其中的組件了。
Java已經為我們提供了幾個常用的布局管理器類,例如: FlowLayout、BorderLayout、GridLayout、GridBagLayout等。下面列表說明它們的布局特點:
包類特點
java.awt CardLayout 將組件象卡片一樣放置在容器中,在某一時刻只有一個組件可見
java.awt FlowLayout 將組件按從左到右而后從上到下的順序依次排列,一行不能放完則折到下一行繼續放置
java.awt GridLayout 形似一個無框線的表格,每個單元格中放一個組件
java.awt BorderLayout 將組件按東、南、西、北、中五個區域放置,每個方向最多只能放置一個組件
java.awt GridBagLayout 非常靈活,可指定組件放置的具體位置及占用單元格數目
Javax.swing BoxLayout 就像整齊放置的一行或者一列盒子,每個盒子中一個組件
Javax.swing SpringLayout 根據一組約束條件放置子組件
Javax.swing ScrollPaneLayout 專用于JScrollPane,含一個Viewport,一個行頭、一個列頭、兩個滾動條和四個角組件
Javax.swing OverlayLayout 以彼此覆蓋的形式疊置組件
Javax.swing ViewportLayout JViewport的默認布局管理器
事實上,在大多數情況下,綜合運用好這些布局管理器已可以滿足需要。當然對于特殊的具體應用,我們可以通過實現LayoutManager或LayoutManager2接口來定義自己的布局管理器。下面我們通過幾個實例來了解幾個常用的布局管理器的使用方法。