GUI概述
早期電腦系統中,電腦向使用者提供的是單調、枯燥、純字元狀態的“命令列介面(CLI)”。就是到現在,我們還可以依稀看到它們的身影:在Windows中開個DOS視窗,就可看到曆史的足跡。
後來,Apple公司率先在電腦的作業系統中實現了圖形化的使用者介面(Graphical User Interface,簡稱GUI),但由於Apple公司封閉的市場策略,自己完成電腦硬體、作業系統、應用軟體一條龍的產品,與其它PC不相容。這使得Apple公司錯過了一次一統全球PC的好機會。
後來,著名的Microsoft公司推出了風靡全球的Windows作業系統,它憑藉著優秀的圖形化使用者介面,一舉奠定了作業系統標準的地位。這也造就了世界首富---比爾.蓋茨和IT業的泰山北鬥微軟公司。
在圖形化使用者介面風行於世的今天,一個應用軟體沒有良好的GUI是無法讓使用者接受的。而Java語言也深知這一點的重要性,它提供了一套可以輕鬆構建GUI的工具。
在Java語言提供的GUI構建工具中,可以分為“組件”(component)和“容器”(Container)兩類。
在Java語言中,提供了以下組件: 按鈕 標籤 複選框 選項按鈕 選擇框 列表框 文字框 捲軸 畫布 菜單
這些組件,我們在使用Windows作業系統時都遇到過,我們能夠通過操作這引起組件來實現與程式的互動。
而光有“組件”是不能組裝成程式的,我們必須使用“容器”將這些“組件”裝配起來,使其成為一個整體。Java語言還提供了以下“容器”: 表單(Form) 對話方塊(Dialog)
Java語言是通過AWT(抽象視窗化工具包)和Java基礎類(JFC或更常用的Swing)來提供這些GUI組件的。
其中Java.awt是最原始的GUI工具包,存放在java.awt包中。現在有許多功能被已被Swing取代並得到了很大的增加與提高,因此一般我們很少再使用Java.awt,但是AWT中還是包含了最核心的功能,通常,一個Java的GUI程式至少還要使用下面幾個類: java.awt.Color:基本顏色定義 java.awt.Font:基本字型定義 java.awt.Cursor:游標操作定義
而Swing是JAVA提供的一組豐富的與平台無關的方式來建立圖形化使用者介面的庫。在這篇文章中,我們將學習Swing GUI控制項。 Swing概述
Swing API 可擴充 GUI組件,以減輕開發人員的生活創造基於JAVA前端/GUI應用。它是建立在AWT API之上,並作為 AWT API 的更換,因為它幾乎每一個控制對應 AWT控制。
Swing 組件遵循MVC(模型-視圖-控制器)架構,MVC讓負責顯示的代碼、處理資料的代碼、對互動進行響應並驅動變化的代碼彼此分離。
MVC
假設我們要舉辦一場時裝秀,如果只是一個人來完成,那麼這個人就身兼數職:設計、修改時裝,到T台展示時裝。
那麼如果我們使用MVC模式來類比一下,就不會讓一個人來做所有的事情。我們會讓時裝模特兒展示服裝,他們扮演的角色就是視圖。模特知道展示服裝(資料)的適當方法,但是他們不知道如何設計和製作服裝。我們讓時裝設計師充當控制器,時裝設計師對於如何在 T 台上走秀沒有概念,但他能設計和製作服裝。時裝模特和設計師都能獨立地處理服裝,但都有自己的專業領域。這就是MVC設計模式背後的概念:“把角色分開”
Swing特點
重量輕-Swing組件是獨立的原生作業系統的API與Swing API控制項呈現大多採用純JAVA代碼,而不是底層的作業系統調用。
豐富的控制項-Swing提供了一套豐富的先進的控制系統,如樹,JTabbedPane,滑塊,顏色選取器,表格控制項
高度可定製-Swing控制項可以定製視覺外觀是非常簡單的方法,獨立的內部表示。
可插拔的外觀和感覺-基於Swing GUI應用程式外觀和風格基於可用值,可以在運行時改變。 組件與容器
JComponent
Swing的整個可視組件庫的基礎構造塊是JComponent,它是所有組件的父類,並且是一個抽象類別,所以我們不能直接建立JComponent對象,但是作為類階層的基礎。從API中我們看到它包含了上百個方法,Swing中的每個組件都可能使用這些方法。
組件都是矩形形狀,組件本身有一個預設的座標系,組件的左上方的座標值是(0,0)。如果一個組件的寬是20,高是10,那麼,該座標系中,x座標的最大值是20;y座標的最大值是10。
組件預設的邊框是一個黑邊的矩形,我們可以通過方法 [java] view plain copy public void setBorder(Border border) 設定組件的邊框。該方法的參數是一個介面,必須向該參數傳遞一個實現介面Border類的執行個體。如果傳遞一個null,組件將取消邊框。
組件的顏色: public void setBackground(Color c):設定組件的背景色。 public void setForeground(Color c):設定組件的前景色彩。 public Color getBackground(Color c):擷取組件的背景色。 public Color getForeground(Color c):擷取組件的前景色彩。 public Color(int red,int green,ing blue):建立一個顏色對象,其中red、green、blue的取值在0到255之間。
組件的字型: public void setFont(Font f):組件調用該方法設定組件上的字型。 public Font getFont(Font f):組件調用該方法擷取組件上的字型。
上述方法中用到了java.awt包中的Font類,Font類的構造方法是: [java] view plain copy public Font(String name,int style,int size) // 建立字型對象。name是字型的名字,style決定字型的樣式,取值是一個整數。
組件的大小與位置: public void setSize(int width,int height):設定組件的大小。 public void setLocation(int x,int y):設定組件在容器中的位置,組件距容器的左、上邊界 x、y 個像素。 public Dimension getSize():返回一個Dimension對象的引用,該對象實體中當前組件的寬度和高度。 public Point getLocation(int x,int y):返回一個Point對象的引用,該對象實體中含有組件的左上方在容器的座標系中的x座標和y座標。 public void setBounds(int x,int y,int width,int height):設定組件在容器中的位置和組件的大小。 public Rectangle getBounds():返回一個Rectangle對象的引用,該對象實體中含有當前組件左上方在容器座標系中的x座標和y座標,寬度和高度。
組件預設是不透明的,我們可以通過方法 [java] view plain copy public void setOpaque(boolean isOpaque) 設定組件是否不透明。isOpaque取false時,組件被設定為透明;isOpaque取true時組件被設定為不透明。方法 [java] view plain copy public boolean isOpaque() 當組件不透明時該方法返回true,否則返回false。
組件的啟用與可見度: public void setEnabled(boolean b):設定組件是否可被啟用。
當參數b取值true時,組件可以被啟用。
當參數b取值false 時,組件不可啟用。
預設情況下,組件是可以被啟用的。
public void setVisible(boolean b):設定組件在該容器中的可見度。
當b取值true時,組件在容器中可見。
當b取值false時,組件在容器中不可見。
除了Window型組件外,其它類型組件預設是可見的。
我們再來認識幾個方法: add( ):將組件添加到該容器中。 removeAll() :移掉容器中的全部組件。 remove(Component c) 移掉容器中參數指定的組件。 validate():每當容器添加新的組件或移掉組件時,調用該方法以保證容器中的組件能正確顯示出來。
JFrame
JFrame類是一個頂層視窗,也是一個容器,允許將其他組件添加到它裡面,把它們組織起來,並把它們呈現給使用者。它有許多其他好處,我們先看最簡單的圖片:
JFrame實際上不僅僅讓您把組件放入其中並呈現給使用者。比起它表面上的簡單性,它實際上是 Swing 包中最複雜的組件。為了最大程度地簡化組件,在獨立於作業系統的Swing組件與實際運行這些組件的作業系統之間,JFrame起著橋樑的作用。JFrame在本機作業系統中是以視窗的形式註冊的,這麼做之後,就可以得到許多熟悉的作業系統視窗的特性:最小化/最大化、改變大小、移動。
常用構造方法: JFrame():可以建立一個無標題的視窗。 JFrame(String title):建立一個標題為title的視窗
常用方法: getTitle()/setTitle():擷取/設定視窗的標題。 getState/setState():擷取/設定視窗的最小化、最大化等狀態。 isVisible()/setVisible():擷取/設定視窗的可視狀態(即是否在螢幕上顯示)。 getLocation/setLocation():擷取/設定視窗在螢幕上應當出現的位置。 getSize()/setSize():擷取/設定視窗的大小。 setBounds():擷取/設定視窗出現在螢幕上時的初始位置與大小。 setResizable():設定視窗是否可調整大小,視窗預設是可調整大小的。 add():將組件添加到視窗中。 setDefaultCloseOperation() :設定單擊表單右上方的關閉表徵圖後,程式會做出怎樣的處理。
JDialog
對話方塊類。
JDialog類是Window的子類。對話方塊必須要依賴於某個視窗或組件,當它所依賴的視窗或組件消失,對話方塊也將消失;當它所依賴的視窗或組件可見時,對話方塊又會自動回復。
我們通過建立JDialog的子類來建立一個對話方塊類。不可以把組件直接添加到對話方塊中,不能為對話方塊設定布局,可以使用getContentPane()方法得到內容面板。
對話方塊可分為無模式和有模式兩種。
如果一個對話方塊是有模式的對話方塊,那麼當這個對話方塊處於啟用狀態時,只讓程式響應對話方塊內部的事件,程式不能再啟用它所依賴的視窗或組件,而且它將堵塞當前線程的執行,直到該對話方塊消失不可見。
無強制回應對話方塊處於啟用狀態時,程式仍能啟用它所依賴的視窗或組件,它也不堵塞線程的執行。
訊息對話方塊:
訊息對話方塊是有強制回應對話方塊。進行一個重要的操作動作之前,最好能彈出一個訊息對話方塊以確定操作。
可以用javax.swing包中的JOptionPane類的靜態方法: [java] view plain copy public static void showMessageDialog (Component parentComponent,String message,String title, int messageType)
建立一個訊息對話方塊。參數分別是對話方塊所依賴的組件、對話方塊上顯示的訊息,對話方塊的標題,對話方塊的外觀。
確認對話方塊:
確認對話方塊是有強制回應對話方塊。可以用javax.swing包中的JOptionPane類的靜態方法: [java] view plain copy public static int showConfirmDialog (Component parentComponent,Object message,String title,int optionType)
建立一個確認對話方塊。
顏色對話方塊:
可以用javax.swing包中的JColorChooser類的靜態方法: [java] view plain copy public static Color showDialog (Component component,String title,Color initialColor)
建立一個顏色對話方塊。參數component指定對話方塊所依賴的組件,title指定對話方塊的標題;initialColor指定對話方塊返回的初始顏色。