程序是爲了方便用戶使用的,所以實現圖形化界面的程序編寫是全部編程語言發展的必然趨勢,在命令提示符下運行的程序可讓咱們瞭解java程序的基本知識體系結構,如今就進入java圖形化界面編程。java
Java基本類(「JavaFoundationClasses」,JFC),由一些軟件包組成。這些軟件包主要包括下面一些應用程序接口(API):編程
上面列出的這些應用程序接口可難會出如今多個軟件包中。例如:2DAPI在Java.awt和Java.awt.image軟件包中都存在,雖然像Java.awt.geom等一些特殊的軟件包也支持2DAPI,可是大量的2DAPI類都存在於Java.awt軟件包中。小程序
AWT(1.1及以上版本)是JFC的核心。AWT爲JFC的構成提供瞭如下基本結構:app
WT是比較舊的雙介面函式庫,它依然高度倚賴各做業平臺自身所具有的繪圖功效機能,且用一個比包容程式(Wrapper)還小的設計還去除、吸取各做業平臺間的繪圖功能機能差別,以至Java程式在跨平臺移攜後的繪圖呈現不夠一致,這使得AWT遭受到衆多的批評。這意味着:AWT的Widget倚賴做業平臺自身原有的Widget功效機能,程式設計師在開發撰寫時必須去了解各做業平臺在Widget方面的差別性,如此便偏離了Java程式語言最初的宗旨:跨平臺一致性。框架
AWT由java.awt包提供,其提供了支持GUI設計的類和接口,而又AWT提供的組建通常稱之爲重量級組件,其是由本地方法來實現其功能的。AWT的特色:編程語言
lAWT中的圖形函數與操做系統所提供的圖形函數之間有着一一對應的關係編輯器
lAWT經過犧牲功能來實現其平臺無關性ide
lAWT不能知足圖形化用戶界面發展的須要函數
爲了解決AWT組件的缺陷,特別是跨平臺的問題,在JDK1.2版本後提供了新的Swing包,有javax.swing提供,Swing是在AWT的基礎上構建的一套新的圖形界面組件,全部組建均是由java書寫,具備良好的跨平臺性,因爲Swing沒有使用本地方法實現圖形功能,所以提出把Swing組件稱之爲輕量級組件。工具
注意:Swing組建是在AWT基礎上創建的,而不是替代AWT的,AWT是根基,Swing是發展。
Swing組件幾乎都是輕量組件,那些頂層容器:窗體,小應用程序、窗口和對話框除外。由於輕量組件是在其容器的窗口中繪製的,而不是在本身的窗口中繪製的,因此輕量組件最終必須包含在一個重量容器中。所以,Swing的窗體、小應用程序、窗口和對話框都必須是重量組件,以便提供一個能夠在其繪製Swing輕量組件的窗口。
Swing包括250多個類,其中有些是UI組件,有些是支持類。爲了把UI組件和支持類區分開,Swing組件的名字以J開頭。表1-1列出了Swing提供的J組件。用斜體字表示的組件是AWT組件的替代組件。
表1-1SwingUI組件以及描述
JApplet Java.applet.Applet類的擴展,它含有JRootPane的一個實例
JButton 能顯示文本和圖形的按鈕,它是AWT按鈕組件的替代組件
JCheckBox 能顯示文本和圖形的複選框,它是AWT選擇組件的替代組件
JCheckBoxMenuItem 一個複選框菜單項,它是AWT的複選框菜單項組件的替代組件
JComboBox 帶下拉列表的文本框,它是AWT選擇組件的替代組件
JComponent 全部輕量J組件的基類
JDesktopPane 內部窗體的容器
JDialog Swing對話框的基類,它擴展了AWT Dialot類
JEditorPane 用於編輯文本的文本窗格
JFrame 擴展java.awt.Frame的外部窗體
JInternalFrame 在JDesktopPane中出現的內部窗體
JLabel 可顯示文本和圖標的標籤,它是AWT標籤組件的替代組件
JLayeredPane 可以在不一樣層上顯示組件的容器
JList 顯示選項列表的組件,它是AWT列表組件的替代組件
JMenu 菜單條中顯示的一個菜單,它是AWT菜單組件的替代組件
JMenuBar 用於顯示菜單的菜單條,它是AWT菜單條組件的替代組件
JMenuItem 菜單項,它是AWT菜單項組件的替代組件
JOptionPane 顯示標準的對話框,如:消息和問題對話框
JPanel 通用容器,它是AWT面板和畫布組件的替代組件
JPasswordfield JTextField的擴展,使輸入的字符不可見
JPopupMenu 彈出式菜單,它是AWT彈出式菜單組件的替代組件
JProgressBar 進度指示器
JRadioButton 單選按鈕,它是AWT複選框組件的替代組件
JRootPane 頂層容器,它包含一個玻璃窗格,一個層窗格,一個內容窗格和一個可選的菜單條
JScrollBar 滾動條,它是AWT滾動條組件的替代組件
JScrollPane 滾動窗格,它是AWT滾動窗格組件的替代組件
JSeparator 水平或垂直分隔條
JSlider 滑桿
JSplitPane 有兩個分隔區的容器,這兩個分隔區能夠水平排列或者垂直排列且分隔區的大小能自動調整
JTabbedPane 帶選項卡的窗格
JTable 表格
JTableHeader 表格頭
JTextArea 用於輸入多行文本的文本域,它是AWT文本域組件的替代組件
JTestComponent 文本組件的基類,它替代AWT的TextComponent類
JTextField 單行文本域,它替代AWT的單行文本域組件
JTextPane 簡單的文本編輯器
JToggleButton 兩種狀態的按鈕,它是JCheckBox和JRadioButton組件的基類
JToolBar 工具條
JToolTip 當光標停留在一個組件上時,該組件上顯示的一行文字
JTree 用於按鈕層次組織數據的結構控件
JViesport 用於瀏覽可滾動組件的視口
JWindow 外部窗口,它是java.awt.Window的擴展
AWT是AbstractWindowToolKit(抽象窗口工具包)的縮寫,這個工具包提供了一套與本地圖形界面進行交互的接口。AWT中的圖形函數與操做系統所提供的圖形函數之間有着一一對應的關係,咱們把它稱爲peers。也就是說,當咱們利用AWT來構件圖形用戶界面的時候,咱們其實是在利用操做系統所提供的圖形庫。因爲不一樣操做系統的圖形庫所提供的功能是不同的,在一個平臺上存在的功能在另一個平臺上則可能不存在。爲了實現Java語言所宣稱的"一次編譯,處處運行"的概念,AWT不得不經過犧牲功能來實現其平臺無關性,也就是說,AWT所提供的圖形功能是各類通用型操做系統所提供的圖形功能的交集。因爲AWT是依靠本地方法來實現其功能的,咱們一般把AWT控件稱爲重量級控件。
Swing是在AWT的基礎上構建的一套新的圖形界面系統,它提供了AWT所可以提供的全部功能,而且用純粹的Java代碼對AWT的功能進行了大幅度的擴充。例如說並非全部的操做系統都提供了對樹形控件的支持,Swing利用了AWT中所提供的基本做圖方法對樹形控件進行模擬。因爲Swing控件是用100%的Java代碼來實現的,所以在一個平臺上設計的樹形控件能夠在其餘平臺上使用。因爲在Swing中沒有使用本地方法來實現圖形功能,咱們一般把Swing控件稱爲輕量級控件。
AWT和Swing之間的基本區別:AWT是基於本地方法的C/C++程序,其運行速度比較快;Swing是基於AWT的Java程序,其運行速度比較慢。對於一個嵌入式應用來講,目標平臺的硬件資源每每很是有限,而應用程序的運行速度又是項目中相當重要的因素。在這種矛盾的狀況下,簡單而高效的AWT固然成了嵌入式Java的第一選擇。而在普通的基於PC或者是工做站的標準Java應用中,硬件資源對應用程序所形成的限制每每不是項目中的關鍵因素,因此在標準版的Java中則提倡使用Swing,也就是經過犧牲速度來實現應用程序的功能。
簡要的講:
AWT是抽象窗口組件工具包,是java最先的用於編寫圖形節目應用程序的開發包。
Swing是爲了解決AWT存在的問題而新開發的包,它以AWT爲基礎的。
上圖列舉了AWT和Swing的關係,也能夠看出Swing是繼承自AWT的。本文主要利用Swing來設計圖形化界面程序。
圖形化界面程序你們都使用過,通常使用一個程序過程是:打開一個程序出現一個窗口或對話框,其中通常有菜單、工具欄、文本框、按鈕、單選框、複選框等控件(組件也就是控件),用戶錄入相關數據,點按相關菜單、按鈕,程序對數據進行相關處理,並將處理後的數據顯示或者保存起來,最後關閉程序。
用java編程的相關設計步驟來分解上面的的程序運行過程以下圖所示:
對應於程序的初始顯現窗口,窗口中放入其它菜單、工具欄、文本框、按鈕等組件
頂層容器圖形化界面顯示的基礎,其它全部的組件(控件)都是直接或間接顯示在頂層容器中的。在java中頂層容器有三種,分別是JFrame(框架窗口,即一般的窗口)、JDialog(對話框)、JApplet(用於設計嵌入在網頁中的java小程序)。
對應於程序中出現的菜單、工具欄(中間容器)、文本框、按鈕、單選框、複選框等控件。
有不少Swing組件可使用,見前面的SwingUI組件表。
在java中建立組件後,還須要將組件放入相應的容器,才能在頂層容器,如窗口中顯示出組件。
組件添加到容器中,還必須設置好組件的顯示位置,通常有兩種方法來設置組建的顯示位置,一是按照與容器的相對距離(以像素爲單位),精確固定控件的位置;二是用佈局管理器來管理組件在容器內的位置。
即用戶執行選擇菜單、單擊按鈕等操做時,就要執行相應的命令,進行相關的程序處理,這就須要設置組件的事件。
Java中組件容器包含頂層容器和中間容器。
在java中頂層容器有三種,分別是JFrame(框架窗口,即一般的窗口)、JDialog(對話框)、JApplet(用於設計嵌入在網頁中的java小程序),頂層容器是容納其它組件的基礎,即設計圖形化程序必需要有頂層容器。
Java中間容器是能夠包含其它相應組件的容器,可是中間容器和組件同樣,不能單獨存在,必須依附於頂層容器。
常見的中間容器有:
以上是JFrame的經常使用方法即說明,下面舉例說明。
實例1:直接定義Jframe類的對象建立一個窗口
// JFrameDemo1.java import javax.swing.*; //使用Swing類,必須引入Swing包 public class JFrameDemo1{ public staticvoid main( String args[]) { //定義一個窗體對象f,窗體名稱爲"一個簡單窗口" Jframe f = new JFrame("一個簡單窗口"); /*設置窗體左上角與顯示屏左上角的座標, 離顯示屏上邊緣300像素,離顯示屏左邊緣300像素 */ f.setLocation(300, 300); //f.setLocationRelativeTo(null);本語句實現窗口居屏幕中央 f.setSize(300,200); //設置窗體的大小爲300*200像素大小 f.setResizable(false); //設置窗體是否能夠調整大小,參數爲布爾值 //設置窗體可見,沒有該語句,窗體將不可見,此語句必須有,不然沒有界面就沒有如何意義了 f.setVisible( true); //用戶單擊窗口的關閉按鈕時程序執行的操做 f.setDefaultCloseOperation(f.EXIT_ON_CLOSE); } }
程序運行結果以下圖所示:
能夠根據程序代碼的註釋,依次修改相應的方法參數查看效果。
setDefaultCloseOperation(intoperation):設置用戶在此窗體上發起"close"時默認執行的操做。方法中的參數解釋以下:
l爲「0」或DO_NOTHING_ON_CLOSE:
(在WindowConstants中定義):不執行任何操做;要求程序在已註冊的WindowListener對象的windowClosing方法中處理該操做。
好比實例程序代碼中更改成f.setDefaultCloseOperation(f.DO_NOTHING_ON_CLOSE);或者f.setDefaultCloseOperation(0),而後查看效果,能夠發現窗口沒法關閉,下面是相同用法,再也不解釋了。
l爲「1」或HIDE_ON_CLOSE
調用任意已註冊的WindowListener對象後自動隱藏該窗體。此時沒有關閉程序,只是將程序界面隱藏了。
能夠打開任務管理器,能夠看到一個叫「java.exe」的進程(若是調試運行了多個java程序,則會看到多個「java.exe」的進程),若是此時用EditPlus測試程序,會發現當單擊窗口的關閉按鈕關閉窗口後,卻沒法再次對程序進行調試,由於程序線程沒有關閉,在任務管理器中關閉java.exe(若是有多個「java.exe」的進程,則先都關閉掉,再來測試該問題)基礎後,EditPlus才能夠從新編譯改程序。
l爲「2」或DISPOSE_ON_CLOSE
調用任意已註冊WindowListener的對象後自動隱藏並釋放該窗體。但繼續運行應用程序,釋放了窗體中佔用的資源。
l爲「3」EXIT_ON_CLOSE(在JFrame中定義):使用Systemexit方法退出應用程序。僅在應用程序中使用。結束了應用程序。
默認狀況下,該值被設置爲HIDE_ON_CLOSE。
當註釋掉實例中的f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);語句時,起到的效果和f.setDefaultCloseOperation(f.HIDE_ON_CLOSE);或者f.setDefaultCloseOperation(1);同樣。
// JFrameDemo2.java importjavax.swing.*; //建立子類MyFrame繼承父類JFrame class MyFrameextends JFrame{ //定義構造函數,帶有四個參數,用於設置窗口位置和大小 MyFrame(int x,int y,int h,int w){ super("一個簡單窗口"); //重寫父類方法,爲窗口定義標題 /*如下的方法調用前面沒有添加對象名,也不可能添加,要建立的對象名稱是什麼都不知道,也就不可能添加。可是建立對象後,對象自動獲取這些初始值。*/ setLocation(x,y); setSize(h,w); setResizable(false); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } } publicclass JFrameDemo2{ public static void main( String args[]) { //實例化類對象,提示設置參數 MyFrame f = new MyFrame(300,300,300,200); } }
上面的例子也能夠不使用構造函數,能夠和實例一方式同樣,代碼能夠改成以下模式。
實例3:一個簡單窗口
// JframeDemo3.java importjavax.swing.*; class MyFrameextends JFrame{ MyFrame(){ } } publicclass JframeDemo3{ public static void main( String args[]) { MyFrame f = new MyFrame(); f.setTitle("一個簡單窗口"); f.setLocationRelativeTo(null); f.setSize(300,200); f.setResizable(false); f.setVisible( true); f.setDefaultCloseOperation(3); } }
以上就是本文關於Java圖形化界面設計之容器(JFrame)詳解的所有內容。許多人說Java圖形化設計不重要,用的人也很少,事實上也確實如此。不過,既然它如此簡單,並且看起來挺有趣的,抽時間學一下也無妨。