1. 程式人生 > >47 java編程思想——創建窗口和程序片 AWT

47 java編程思想——創建窗口和程序片 AWT

初始化 top web fonts fir 類文件 ftp 行為 面向

47.java編程思想——創建窗口和程序片 AWT

在Java 1.0 中,圖形用戶接口(GUI)庫最初的設計目標是讓程序員構建一個通用的GUI,使其在所有平臺上都能正常顯示。

但遺憾的是,這個目標並未達到。事實上,Java 1.0 版的“抽象Windows 工具包”(AWT)產生的是在各系統看來都同樣欠佳的圖形用戶接口。除此之外,它還限制我們只能使用四種字體,並且不能訪問操作系統中現有的高級GUI 元素。同時,Jave1.0 版的AWT編程模型也不是面向對象的,極不成熟。這類情況在Java1.1版的AWT 事件模型中得到了很好的改進,例如:更加清晰、面向對象的編程、遵循JavaBeans 的範例,以及一個可輕松創建可視編程環境的編程組件模型。Java1.2 為老的Java 1.0 AWT 添加了Java 基礎類(AWT),這是一個被稱為“Swing”的GUI的一部分。豐富的、易於使用和理解的Java Beans 能經過拖放操作(像手工編程一樣的好),創建出能使程序員滿意的GUI。軟件業的“3 次修訂版”規則看來對於程序設計語言也是成立的(一個產品除非經過第3 次修訂,否則不會盡如人意)。

Java 的主要設計目的之一是建立程序片,也就是建立運行在WEB 瀏覽器上的小應用程序。由於它們必須是安全的,所以程序片在運行時必須加以限制。無論怎樣,它們都是支持客戶端編程的強有力的工具,一個重要的應用便是在Web 上。

在一個程序片中編程會受到很多的限制,我們一般說它“在沙箱內”,這是由於Java 運行時一直會有某個東西——即Java 運行期安全系統——在監視著我們。Jave 1.1 為程序片提供了數字簽名,所以可選出能信賴的程序片去訪問主機。不過,我們也能跳出沙箱的限制寫出可靠的程序。在這種情況下,我們可訪問操作系統中的其他功能。AWT 也能用來為可靠的程序建立GUI 接口。

先學習使用老的AWT 工具,會與許多支持和使用AWT 的代碼程序樣本相遇。盡管這有一些困難,但卻是必須的,因為我們必須用老的AWT 來維護和閱讀傳統的Java 代碼。有時甚至需要我們編寫AWT 代碼去支持不能從Java1.0 升級的環境。

大多數的例程都將展示程序片的建立,這並不僅僅是因為這非常的容易,更因為這是AWT 的主要作用。另外,當用AWT 創建一個可靠的程序時,我們將看到處理程序的不同之處,以及怎樣創建能在命令行和瀏覽器中運行的程序。

1 AWT

對於“老式”AWT,它最嚴重的缺點就是它無論在面向對象設計方面,還是在GUI 開發包設計方面,都有不盡如人意的表現。它使我們回到了程序設計的黑暗年代(換成其他話就是“拙劣的”、“可怕的”、“惡劣的”等等)。必須為執行每一個事件編寫代碼,包括在其他環境中利用“資源”即可輕松完成的一些任務。

許多象這樣的問題在Java 1.1 裏都得到了緩解或排除,因為:

(1)Java 1.1 的新型AWT 是一個更好的編程模型,並向更好的庫設計邁出了可喜的一步。而Java Beans 則是那個庫的框架。

(2)“GUI 構建器”(可視編程環境)將適用於所有開發系統。在我們用圖形化工具將組件置入窗體的時候,Java Beans 和新的AWT 使GUI構建器能幫我們自動完成代碼。其它組件技術如ActiveX 等也將以相同的形式支持。

既然如此,為什麽還要學習使用老的AWT 呢?原因很簡單,因為它的存在是個事實。就目前來說,這個事實對我們來說顯得有些不利,它涉及到面向對象庫設計的一個宗旨:一旦我們在庫中公布一個組件,就再不能去掉它。如去掉它,就會損害別人已存在的代碼。另外,當我們學習Java 和所有使用老AWT 的程序時,會發現有許多原來的代碼使用的都是老式AWT。

AWT 必須能與固有操作系統的GUI 組件打交通,這意味著它需要執行一個程序片不可能做到的任務。一個不被信任的程序片在操作系統中不能作出任何直接調用,否則它會對用戶的機器做出不恰當的事情。一個不被信任的程序片不能訪問重要的功能。例如,“在屏幕上畫一個窗口”的唯一方法是通過調用擁有特殊接口和安全檢查的標準Java 庫。Sun 公司的原始模型創建的信任庫將僅僅供給Web 瀏覽器中的Java 系統信任關系自動授權器使用,自動授權器將控制怎樣進入到庫中去。

Java 1.1 版中的新模型是“信任代碼”或“簽名代碼”,因此一個特殊服務器將校驗我們下載的、由規定的開發者使用的公共密鑰加密系統的代碼。這樣我們就可知道代碼從何而來,那真的是Bob 的代碼,還是由某人偽裝成Bob 的代碼。這並不能阻止Bob 犯錯誤或作某些惡意的事,但能防止Bob 逃避匿名制造計算機病毒的責任。一個數字簽名的程序片——“被信任的程序片”——在Java1.1 版能進入我們的機器並直接控制它,正像一些其它的應用程序從信任關系自動授權機中得到“信任”並安裝在我們的機器上。

這是老AWT 的所有特點。老的AWT 代碼將一直存在,新的Java 編程者在從舊的書本中學習時將會遇到老的AWT 代碼。同樣,老的AWT 也是值得去學習的,例如在一個只有少量庫的例程設計中。老的AWT 所包括的範圍在不考慮深度和枚舉每一個程序和類,取而代之的是給了我們一個老AWT 設計的概貌。

2 基本程序片

庫通常按照它們的功能來進行組合。一些庫,例如使用過的,便中斷擱置起來。標準的Java 庫字符串和矢量類就是這樣的一個例子。其他的庫被特殊地設計,例如構建塊去建立其它的庫。庫中的某些類是應用程序的框架,其目的是協助我們構建應用程序,在提供類或類集的情況下產生每個特定應用程序的基本活動狀況。

然後,為我們定制活動狀況,必須繼承應用程序類並且廢棄程序的權益。應用程序框架的默認控制結構將在特定的時間調用我們廢棄的程序。應用程序的框架是“分離、改變和中止事件”的好例子,因為它總是努力去嘗試集中在被廢棄的所有特殊程序段。

程序片利用應用程序框架來建立。我們從類中繼承程序片,並且廢棄特定的程序。大多數時間我們必須考慮一些不得不運行的使程序片在WEB 頁面上建立和使用的重要方法。這些方法是:

方法 作用

init() 程序片第一次被創建,初次運行初始化程序片時調用

start() 每當程序片進入Web 瀏覽器中,並且允許程序片啟動它的常規操作時調用(特殊的程序片被stop()關閉);同樣在init()後調用paint() 基礎類Component 的一部分(繼承結構中上溯三級)。作為update() 的一部分調用,以便對程序片的畫布進行特殊的描繪

stop() 每次程序片從Web 瀏覽器的視線中離開時調用,使程序片能關閉代價高昂的操作;同樣在調用destroy()前調用

destroy() 程序片不再需要,將它從頁面中卸載時調用,以執行資源的最後清除工作

現在來看一看paint()方法。一旦Component(目前是程序片)決定自己需要更新,就會調用這個方法——可能是由於它再次回轉屏幕,首次在屏幕上顯示,或者是由於其他窗口臨時覆蓋了你的Web 瀏覽器。此時程序片會調用它的update()方法(在基礎類Component 中定義),該方法會恢復一切該恢復的東西,而調用paint()正是這個過程的一部分。沒必要對paint()進行過載處理,但構建一個簡單的程序片無疑是方便的方法,所以我們首先從paint()方法開始。

update()調用paint()時,會向其傳遞指向Graphics 對象的一個句柄,那個對象代表準備在上面描繪(作

圖)的表面。這是非常重要的,因為我們受到項目組件的外觀的限制,因此不能畫到區域外,這可是一件好事,否則我們就會畫到線外去。在程序片的例子中,程序片的外觀就是這界定的區域。

圖形對象同樣有一系列我們可對其進行的操作。這些操作都與在畫布上作圖有關。所以其中的大部分都要涉及圖像、幾何菜狀、圓弧等等的描繪(註意如果有興趣,可在Java 文檔中找到更詳細的說明)。有些方法允許我們畫出字符,而其中最常用的就是drawString()。對於它,需指出自己想描繪的String(字串),並指定它在程序片作圖區域的起點。這個位置用像素表示,所以它在不同的機器上看起來是不同的,但至少是可以移植的。

2.1 代碼

import java.awt.*;

import java.applet.*;

public class Applet1 extends Applet {

public voidpaint(Graphics g){

g.drawString("First applet", 10, 10);

}

} /// :~

2.2 執行

如下圖1技術分享圖片

這個程序片不需要有一個main()。所有內容都封裝到應用程序框架中;我們將所有啟動代碼都放在init()裏。

將這個程序放到一個Web 頁中運行,而只能在支持Java 的Web 瀏覽器中才能看到此頁。為了將一個程序片置入Web 頁,需要在那個Web 頁的代碼中設置一個特殊的標記,以指示網頁裝載和運行程序片。這就是applet 標記,它在Applet1 中的樣子如下:

<applet

code=Applet1

width=200

height=200>

</applet>

其中,code 值指定了.class文件的名字,程序片就駐留在那個文件中。width 和height指定這個程序片的初始尺寸(如前所述,以像素為單位)。還可將另一些東西放入applet 標記:用於在因特網上尋找其他.class 文件的位置(codebase)、對齊和排列信息(align)、使程序片相互間能夠通信的一個特殊標識符(name)以及用於提供程序片能接收的信息的參數。參數采取下述形式:

<Paramname=標識符 value="信息">

可根據需要設置任意多個這樣的參數。

在簡單的程序片中,我們要做的唯一事情是按上述形式在Web 頁中設置一個程序片標記(applet),令其裝載和運行程序片。

在最新的ECLIPSE開發工具上可以直接調試 APPLET的。

3 程序片的測試

我們可在不必建立網絡連接的前提下進行一次簡單的測試,方法是啟動我們的Web 瀏覽器,然後打開包含了程序片標簽的HTML 文件(Sun 公司的JDK 同樣包括一個稱為“程序片觀察器”的工具,它能挑出html 文件的<applet> 標記,並運行這個程序片,不必顯示周圍的HTML 文本)。html 文件載入後,瀏覽器會發現程序片的標簽,並查找由code 值指定的.class 文件。當然,它會先在CLASSPATH(類路徑)中尋找,如果在CLASSPATH 下找不到類文件,就在WEB 瀏覽器狀態欄給出一個錯誤信息,告知不能找到.class 文件。

由於程序片觀察器會忽略除APPLET 標記之外的任何東西,所以可將那些標記作為註釋置入Java 源碼:

// <appletcode=MyApplet.class width=200 height=100></applet>

這樣就可直接執行“appletviewer MyApplet.java”,不必再創建小的HTML 文件來完成測試。

若想在Web 站點上試驗,還會碰到另一些麻煩。首先,我們必須有一個Web 站點,這對大多數人來說都意味著位於遠程地點的一家服務提供商(ISP)。然後必須通過某種途徑將HTML 文件和.class 文件從自己的站點移至ISP 機器上正確的目錄(WWW 目錄)。這一般是通過采用“文件傳輸協議”(FTP)的程序來做成的,網上可找到許多這樣的免費程序。所以我們要做的全部事情似乎就是用FTP協議將文件移至ISP 的機器,然後用自己的瀏覽器連接網站和HTML文件;假如程序片正確裝載和執行,就表明大功告成。但真是這樣嗎?

但這兒我們可能會受到愚弄。假如Web 瀏覽器在服務器上找不到.class 文件,就會在你的本地機器上搜尋CLASSPATH。所以程序片或許根本不能從服務器上正確地裝載,但在你看來卻是一切正常的,因為瀏覽器在你的機器上找到了它需要的東西。但在其他人訪問時,他們的瀏覽器就無法找到那些類文件。所以在測試時,必須確定已從自己的機器刪除了相關的.class 文件,以確保測試結果的真實。

4 圖形化的例子

4.1 代碼2

import java.awt.*;

import java.applet.*;

public class Applet2 extends Applet {

public voidpaint(Graphics g){

g.drawString("Second applet", 10, 15);

g.draw3DRect(0, 0, 100, 20, true);

}

} /// :~

4.2 執行

圖2

技術分享圖片

這個程序用一個方框將字符串包圍起來。當然,所有數字都是“硬編碼”的(指數字固定於程序內部),並以像素為基礎。所以在一些機器上,框會正好將字串圍住;而在另一些機器上,也許根本看不見這個框,因為不同機器安裝的字體也會有所區別。

對Graphic 類而言,可在幫助文檔中找到另一些有趣的內容。大多數涉及圖形的活動都是很有趣的。

5 框架方法的演示

觀看框架方法的實際運作是相當有趣的。下面的程序片將跟蹤這些方法調用的次數,並用paint()將其顯示出來:

5.1 代碼3

import java.awt.*;

import java.applet.*;

public class Applet3 extends Applet {

String s;

int inits= 0;

int starts= 0;

int stops= 0;

public voidinit() {

inits++;

}

public voidstart() {

starts++;

}

public voidstop() {

stops++;

}

public voidpaint(Graphics g){

s = "inits:" + inits + ", starts: " + starts+ ", stops: " + stops;

g.drawString(s, 10, 10);

}

} /// :~

5.2 執行

正常情況下,當我們過載一個方法時,需檢查自己是否需要調用方法的基礎類版本,這是十分重要的。例如,使用init()時可能需要調用super.init()。然而,Applet 文檔特別指出init()、start()和stop()在Applet 中沒有用處,所以這裏不需要調用它們。

試驗這個程序片時,會發現假如最小化WEB 瀏覽器,或者用另一個窗口將其覆蓋,那麽就不能再調用stop()和start()(這一行為會隨著不同的實現方案變化;可考慮將Web 瀏覽器的行為同程序片觀察器的行為對照一下)。調用唯一發生的場合是在我們轉移到一個不同的Web 頁,然後返回包含了程序片的那個頁時。

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!希望你也加入到我們人工智能的隊伍中來!https://www.cnblogs.com/captainbed

47 java編程思想——創建窗口和程序片 AWT