?? chapter13.htm
字號:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Thinking in Java | Chinese Version by Trans Bot</title>
<meta name="Microsoft Theme" content="inmotion 111, default"></head>
<body background="../_themes/inmotion/inmtextb.gif" tppabs="http://member.netease.com/%7etransbot/Thinking%20in%20Java/_themes/inmotion/inmtextb.gif" bgcolor="#FFFFCC" text="#000000" link="#800000" vlink="#996633" alink="#FF3399">
<p>第十三章 創建窗口和程序片<br>
<br>
在Java 1.0中,圖形用戶接口(GUI)庫最初的設計目標是讓程序員構建一個通用的GUI,使其在所有平臺上都能正常顯示。<br>
但遺憾的是,這個目標并未達到。事實上,Java 1.0版的“抽象Windows工具包”(AWT)產生的是在各系統看來都同樣欠佳的圖形用戶接口。除此之外,它還限制我們只能使用四種字體,并且不能訪問操作系統中現有的高級GUI元素。同時,Jave1.0版的AWT編程模型也不是面向對象的,極不成熟。這類情況在Java1.1版的AWT事件模型中得到了很好的改進,例如:更加清晰、面向對象的編程、遵循Java
Beans的范例,以及一個可輕松創建可視編程環境的編程組件模型。Java1.2為老的Java
1.0 AWT添加了Java基礎類(AWT),這是一個被稱為“Swing”的GUI的一部分。豐富的、易于使用和理解的Java
Beans能經過拖放操作(像手工編程一樣的好),創建出能使程序員滿意的GUI。軟件業的“3次修訂版”規則看來對于程序設計語言也是成立的(一個產品除非經過第3次修訂,否則不會盡如人意)。<br>
Java的主要設計目的之一是建立程序片,也就是建立運行在WEB
瀏覽器上的小應用程序。由于它們必須是安全的,所以程序片在運行時必須加以限制。無論怎樣,它們都是支持客戶端編程的強有力的工具,一個重要的應用便是在Web上。<br>
在一個程序片中編程會受到很多的限制,我們一般說它“在沙箱內”,這是由于Java運行時一直會有某個東西——即Java運行期安全系統——在監視著我們。Jave
1.1為程序片提供了數字簽名,所以可選出能信賴的程序片去訪問主機。不過,我們也能跳出沙箱的限制寫出可靠的程序。在這種情況下,我們可訪問操作系統中的其他功能。在這本書中我們自始至終編寫的都是可靠的程序,但它們成為了沒有圖形組件的控制臺程序。AWT也能用來為可靠的程序建立GUI接口。<br>
在這一章中我們將先學習使用老的AWT工具,我們會與許多支持和使用AWT的代碼程序樣本相遇。盡管這有一些困難,但卻是必須的,因為我們必須用老的AWT來維護和閱讀傳統的Java代碼。有時甚至需要我們編寫AWT代碼去支持不能從Java1.0升級的環境。在本章第二部分,我們將學習Java
1.1版中新的AWT結構并會看到它的事件模型是如此的優秀(如果能掌握的話,那么在編制新的程序時就可使用這最新的工具。最后,我們將學習新的能像類庫一樣加入到Java
1.1版中的JFC/Swing組件,這意味著不需要升級到Java 1.2便能使用這一類庫。<br>
大多數的例程都將展示程序片的建立,這并不僅僅是因為這非常的容易,更因為這是AWT的主要作用。另外,當用AWT創建一個可靠的程序時,我們將看到處理程序的不同之處,以及怎樣創建能在命令行和瀏覽器中運行的程序。<br>
請注意的是這不是為了描述類的所有程序的綜合解釋。這一章將帶領我們從摘要開始。當我們查找更復雜的內容時,請確定我們的信息瀏覽器通過查找類和方法來解決編程中的問題(如果我們正在使用一個開發環境,信息瀏覽器也許是內建的;如果我們使用的是SUN公司的JDK則這時我們要使用WEB瀏覽器并在Java根目錄下面開始)。附錄F列出了用于深入學習庫知識的其他一些參考資料。<br>
<br>
13.1 為何要用AWT?<br>
對于本章要學習的“老式”AWT,它最嚴重的缺點就是它無論在面向對象設計方面,還是在GUI開發包設計方面,都有不盡如人意的表現。它使我們回到了程序設計的黑暗年代(換成其他話就是“拙劣的”、“可怕的”、“惡劣的”等等)。必須為執行每一個事件編寫代碼,包括在其他環境中利用“資源”即可輕松完成的一些任務。<br>
許多象這樣的問題在Java 1.1里都得到了緩解或排除,因為:<br>
(1)Java 1.1的新型AWT是一個更好的編程模型,并向更好的庫設計邁出了可喜的一步。而Java
Beans則是那個庫的框架。<br>
(2)“GUI構建器”(可視編程環境)將適用于所有開發系統。在我們用圖形化工具將組件置入窗體的時候,Java
Beans和新的AWT使GUI構建器能幫我們自動完成代碼。其它組件技術如ActiveX等也將以相同的形式支持。<br>
<br>
既然如此,為什么還要學習使用老的AWT呢?原因很簡單,因為它的存在是個事實。就目前來說,這個事實對我們來說顯得有些不利,它涉及到面向對象庫設計的一個宗旨:一旦我們在庫中公布一個組件,就再不能去掉它。如去掉它,就會損害別人已存在的代碼。另外,當我們學習Java和所有使用老AWT的程序時,會發現有許多原來的代碼使用的都是老式AWT。<br>
AWT必須能與固有操作系統的GUI組件打交通,這意味著它需要執行一個程序片不可能做到的任務。一個不被信任的程序片在操作系統中不能作出任何直接調用,否則它會對用戶的機器做出不恰當的事情。一個不被信任的程序片不能訪問重要的功能。例如,“在屏幕上畫一個窗口”的唯一方法是通過調用擁有特殊接口和安全檢查的標準Java庫。Sun公司的原始模型創建的信任庫將僅僅供給Web瀏覽器中的Java系統信任關系自動授權器使用,自動授權器將控制怎樣進入到庫中去。<br>
但當我們想增加操作系統中訪問新組件的功能時該怎么辦?等待Sun來決定我們的擴展被合并到標準的Java庫中,但這不一定會解決我們的問題。Java
1.1版中的新模型是“信任代碼”或“簽名代碼”,因此一個特殊服務器將校驗我們下載的、由規定的開發者使用的公共密鑰加密系統的代碼。這樣我們就可知道代碼從何而來,那真的是Bob的代碼,還是由某人偽裝成Bob的代碼。這并不能阻止Bob犯錯誤或作某些惡意的事,但能防止Bob逃避匿名制造計算機病毒的責任。一個數字簽名的程序片——“被信任的程序片”——在Java
1.1版能進入我們的機器并直接控制它,正像一些其它的應用程序從信任關系自動授權機中得到“信任”并安裝在我們的機器上。<br>
這是老AWT的所有特點。老的AWT代碼將一直存在,新的Java編程者在從舊的書本中學習時將會遇到老的AWT代碼。同樣,老的AWT也是值得去學習的,例如在一個只有少量庫的例程設計中。老的AWT所包括的范圍在不考慮深度和枚舉每一個程序和類,取而代之的是給了我們一個老AWT設計的概貌。<br>
<br>
13.2 基本程序片<br>
庫通常按照它們的功能來進行組合。一些庫,例如使用過的,便中斷擱置起來。標準的Java庫字符串和矢量類就是這樣的一個例子。其他的庫被特殊地設計,例如構建塊去建立其它的庫。庫中的某些類是應用程序的框架,其目的是協助我們構建應用程序,在提供類或類集的情況下產生每個特定應用程序的基本活動狀況。然后,為我們定制活動狀況,必須繼承應用程序類并且廢棄程序的權益。應用程序框架的默認控制結構將在特定的時間調用我們廢棄的程序。應用程序的框架是“分離、改變和中止事件”的好例子,因為它總是努力去嘗試集中在被廢棄的所有特殊程序段。<br>
程序片利用應用程序框架來建立。我們從類中繼承程序片,并且廢棄特定的程序。大多數時間我們必須考慮一些不得不運行的使程序片在WEB頁面上建立和使用的重要方法。這些方法是:<br>
<br>
591頁表<br>
<br>
方法 作用<br>
<br>
init() 程序片第一次被創建,初次運行初始化程序片時調用<br>
start() 每當程序片進入Web瀏覽器中,并且允許程序片啟動它的常規操作時調用(特殊的程序片被stop()關閉);同樣在init()后調用<br>
paint() 基礎類Component的一部分(繼承結構中上溯三級)。作為update()的一部分調用,以便對程序片的畫布進行特殊的描繪<br>
stop() 每次程序片從Web瀏覽器的視線中離開時調用,使程序片能關閉代價高昂的操作;同樣在調用destroy()前調用<br>
destroy()
程序片不再需要,將它從頁面中卸載時調用,以執行資源的最后清除工作<br>
<br>
現在來看一看paint()方法。一旦Component(目前是程序片)決定自己需要更新,就會調用這個方法——可能是由于它再次回轉屏幕,首次在屏幕上顯示,或者是由于其他窗口臨時覆蓋了你的Web瀏覽器。此時程序片會調用它的update()方法(在基礎類Component中定義),該方法會恢復一切該恢復的東西,而調用paint()正是這個過程的一部分。沒必要對paint()進行過載處理,但構建一個簡單的程序片無疑是方便的方法,所以我們首先從paint()方法開始。<br>
update()調用paint()時,會向其傳遞指向Graphics對象的一個句柄,那個對象代表準備在上面描繪(作圖)的表面。這是非常重要的,因為我們受到項目組件的外觀的限制,因此不能畫到區域外,這可是一件好事,否則我們就會畫到線外去。在程序片的例子中,程序片的外觀就是這界定的區域。<br>
圖形對象同樣有一系列我們可對其進行的操作。這些操作都與在畫布上作圖有關。所以其中的大部分都要涉及圖像、幾何菜狀、圓弧等等的描繪(注意如果有興趣,可在Java文檔中找到更詳細的說明)。有些方法允許我們畫出字符,而其中最常用的就是drawString()。對于它,需指出自己想描繪的String(字串),并指定它在程序片作圖區域的起點。這個位置用像素表示,所以它在不同的機器上看起來是不同的,但至少是可以移植的。<br>
根據這些信息即可創建一個簡單的程序片:<br>
<br>
592頁上程序<br>
<br>
注意這個程序片不需要有一個main()。所有內容都封裝到應用程序框架中;我們將所有啟動代碼都放在init()里。<br>
必須將這個程序放到一個Web頁中才能運行,而只能在支持Java的Web瀏覽器中才能看到此頁。為了將一個程序片置入Web頁,需要在那個Web頁的代碼中設置一個特殊的標記(注釋①),以指示網頁裝載和運行程序片。這就是applet標記,它在Applet1中的樣子如下:<br>
<br>
592頁下程序<br>
<br>
①:本書假定讀者已掌握了HTML的基本知識。這些知識不難學習,有許多書籍和網上資源都可以提供幫助。<br>
<br>
其中,code值指定了.class文件的名字,程序片就駐留在那個文件中。width和height指定這個程序片的初始尺寸(如前所述,以像素為單位)。還可將另一些東西放入applet標記:用于在因特網上尋找其他.class文件的位置(codebase)、對齊和排列信息(align)、使程序片相互間能夠通信的一個特殊標識符(name)以及用于提供程序片能接收的信息的參數。參數采取下述形式:<br>
<Paramname=標識符 value ="信息"><br>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -