Time of Update: 2017-02-27
GridLayout允許我們建立一個組件表。添加那些組件時,它們會按從左至右、從上到下的順序在網格中排列。在構建器裡,需要指定自己希望的行、列數,它們將按正比例展開。 //: GridLayout1.java// Demonstrating the GridLayoutimport java.awt.*;import java.applet.*;public class GridLayout1 extends Applet { public void init() {
Time of Update: 2017-02-27
布局管理器有四邊和中間地區的概念。當我們增加一些事物到使用BorderLayout的面板上時我們必須使用add()方法將一個字串對象作為它的第一個自變數,並且字串必須指定(正確的大寫)“North”(上),“South”(下),“west”(左),“East”(右)或者“Center”。如果我們拼字錯誤或沒有大寫,就會得到一個編譯時間的錯誤,並且程式片不會像你所期望的那樣運行。
Time of Update: 2017-02-27
到目前為止,所有的程式片都被建立,看起來使用一些不可思議的內部邏輯來布置它們的組件。那是因為程式使用一個預設的方式:FlowLayout。這個簡單的“Flow”的組件安裝在表單中,從左至右,直到頂部的空格全部再移去一行,並繼續迴圈這些組件。這裡有一個例子明確地(當然也是多餘地)設定一個程式片的布局管理器去FlowLayout,然後在表單中安放按鈕。我們將注意到FlowLayout組件使用它們本來的大小。例如一個按鈕將會變得和它的字串符一樣的大小。 //:
Time of Update: 2017-02-27
到目前為止,我們已使用了action(),現有另一種方法handleEvent()可對每一事件進行嘗試。當一個事件發生時,它總是針對單獨事件或發生在單獨的事件對象上。該對象的handleEvent()方法是自動調用的,並且是被handleEvent()建立並傳遞到handleEvent()裡。預設的handleEvent()(handleEvent()定義在組件裡,基礎類的所有控制項都在AWT裡)將像我們以前一樣調用action()或其它同樣的方法去指明滑鼠的活動、鍵盤活動或者指明移動的焦點。我
Time of Update: 2017-02-27
列表框與選擇框有完全的不同,而不僅僅是當我們在啟用選擇框時的顯示不同,列表框固定在螢幕的指定位置不會改變。另外,一個列表框允許多個選擇:如果我們單擊在超過一個的項目上,未選擇的則表現為高亮度,我們可以選擇象我們想要的一樣的多。如果我們想察看項目列表,我們可以調用getSelectedItem()來產生一個被選擇的項目列表。要想從一個組裡刪除一個項目,我們必須再一次的單擊它。列表框,當然這裡有一個問題就是它預設的動作是雙擊而不是單擊。單擊從組中增加或刪除項目,雙擊調用action()。解決這個問題
Time of Update: 2017-02-27
下拉式清單像一個單選鈕組,它是強制使用者從一組可實現的選擇中選擇一個對象的方法。而且,它是一個實現這點的相當簡潔的方法,也最易改變選擇而不至使使用者感到吃力(我們可以動態地改變單選鈕,但那種方法顯然不方便)。Java的選擇框不像Windows中的組合框可以讓我從列表中選擇或輸入自己的選擇。在一個選擇框中你只能從列表中選擇僅僅一個項目。在下面的例子裡,選擇框從一個確定輸入的數字開始,然後當按下一個按鈕時,新輸入的數字增加到框裡。你將可以看到選擇框的一些有趣的狀態: //: Choice1
Time of Update: 2017-02-27
選項按鈕在GUI程式設計中的概念來自於老式的電子管汽車收音機的機械按鈕:當我們按下一個按鈕時,其它的按鈕就會彈起。因此它允許我們強制從眾多選擇中作出單一選擇。AWT沒有單獨的描述單選鈕的類;取而代之的是複用複選框。然而將複選框放在單選鈕組中(並且修改它的外形使它看起來不同於一般的複選框)我們必須使用一個特殊的構建器象一個自變數一樣的作用在checkboxGroup對象上。(我們同樣能在建立複選框後調用setCheckboxGroup()方法。)一個複選框組沒有構建器的自變數;它存在的唯一理由就是
Time of Update: 2017-02-27
複選框提供一個製造單一選擇開關的方法;它包括一個小框和一個標籤。典型的複選框有一個小的“X”(或者它設定的其它類型)或是空的,這依靠項目是否被選擇來決定的。我們會使用構建器正常地建立一個複選框,使用它的標籤來充當它的自變數。如果我們在建立複選框後想讀出或改變它,我們能夠擷取和設定它的狀態,同樣也能擷取和設定它的標籤。注意,複選框的大寫是與其它的控制相矛盾的。無論何時一個複選框都可以設定和清除一個事件指令,我們可以捕捉同樣的方法做一個按鈕。在下面的例子裡使用一個文字地區枚舉
Time of Update: 2017-02-27
標籤準確地運作:安放一個標籤到表單上。這對沒有標籤的TextFields和Text areas
Time of Update: 2017-02-27
“文本地區”很像文字欄位,只是它擁有更多的行以及一些令人信服的更多的功能。另外你能在給定位置對一個文字欄位追加、插入或者修改文字。這看起來對文字欄位有用的功能相當不錯,所以設法發現它設計的特性會產生一些困惑。我們可以認為如果我們處處需要“文本地區”的功能,那麼可以簡單地使用一個線型文字地區在我們將另外使用文字欄位的地方。在Java 1.0版中,當它們不是固定的時候我們也得到了一個文本地區的垂直和水平方向的捲軸。在Java
Time of Update: 2017-02-27
“文字欄位”是允許使用者輸入和編輯文字的一種線性地區。文字欄位從文本組件那裡繼承了讓我們選擇文字、讓我們像得到字串一樣得到選擇的文字,得到或設定文字,設定文字欄位是否可編輯以及連同我們從線上參考書中找到的相關方法。下面的例子將證明文字欄位的其它功能;我們能注意到方法名是顯而易見的: //: TextField1.java// Using the text field controlimport java.awt.*;import
Time of Update: 2017-02-27
前幾天一個網友指出了我的文章中一些有失偏頗之處,那些文章都是我在閱讀Java
Time of Update: 2017-02-27
大家可注意到假如編譯和運行上面的程式片,按下按鈕後不會發生任何事情。必須進入程式片內部,編寫用於決定要發生什麼事情的代碼。對於由事件驅動的程式設計,它的基本目標就是用代碼捕獲發生的事件,並由代碼對那些事件作出響應。事實上,GUI的大部分內容都是圍繞這種事件驅動的程式設計展開的。經過本書前面的學習,大家應該有了物件導向程式設計的一些基礎,此時可能會想到應當有一些物件導向的方法來專門控制事件。例如,也許不得不繼承每個按鈕,並過載一些“按鈕按下”方法(儘管這顯得非常麻煩有有限)
Time of Update: 2017-02-27
製作一個按鈕非常簡單:只需要調用Button構建器,並指定想在按鈕上出現的標籤就行了(如果不想要標籤,亦可使用預設構建器,但那種情況極少出現)。可參照後面的程式為按鈕建立一個控制代碼,以便以後能夠引用它。Button是一個組件,象它自己的小視窗一樣,會在更新時得以重繪。這意味著我們不必明確描繪一個按鈕或者其他任意種類的控制項;只需將它們納入表單,以後的描繪工作會由它們自行負責。所以為了將一個按鈕置入表單,需要過載init()方法,而不是過載paint(): //:
Time of Update: 2017-02-27
觀看架構方法的實際運作是相當有趣的(這個例子只使用init(),start()和stop(),因為paint()和destroy()非常簡單,很容易就能掌握)。下面的程式片將跟蹤這些方法調用的次數,並用paint()將其顯示出來: //: Applet3.java// Shows init(), start() and stop() activitiesimport java.awt.*;import java.applet.*;public class Applet3
Time of Update: 2017-02-27
庫通常按照它們的功能來進行組合。一些庫,例如使用過的,便中斷擱置起來。標準的Java庫字串和向量類就是這樣的一個例子。其他的庫被特殊地設計,例如構建塊去建立其它的庫。庫中的某些類是應用程式的架構,其目的是協助我們構建應用程式,在提供類或類集的情況下產生每個特定應用程式的基本活動狀況。然後,為我們定製活動狀況,必須繼承應用程式類並且廢棄程式的權益。應用程式架構的預設控制結構將在特定的時間調用我們廢棄的程式。應用程式的架構是“分離、改變和中止事件”的好例子,因為它總是努力去嘗
Time of Update: 2017-02-27
由於Java中的所有東西都是控制代碼,而且由於每個對象都是在記憶體堆中建立的——只有不再需要的時候,才會當作垃圾收集掉,所以對象的操作方式發生了變化,特別是在傳遞和返回對象的時候。舉個例子來說,在C和C++中,如果想在一個方法裡初始化一些儲存空間,可能需要請求使用者將那片儲存地區的地址傳遞進入方法。否則就必須考慮由誰負責清除那片地區。因此,這些方法的介面和對它們的理解就顯得要複雜一些。但在Java中,根本不必關心由誰負責清除,也不必關心在需要一個對象的時候它是否仍然存在。
Time of Update: 2017-02-27
這裡總結一下同時適用於String和StringBuffer的方法,以便對它們相互間的溝通方式有一個印象。這些表格並未把每個單獨的方法都包括進去,而是包含了與本次討論有重要關係的方法。那些已被覆蓋的方法用單獨一行總結。首先總結String類的各種方法:方法 自變數,覆蓋 用途構建器 已被覆蓋:預設,String,StringBuffer,char數組,byte數組 建立String對象length() 無 String中的字元數量charAt() int Index
Time of Update: 2017-02-27
請觀察下述代碼: //: Stringer.javapublic class Stringer { static String upcase(String s) { return s.toUpperCase(); } public static void main(String[] args) { String q = new String("howdy"); System.out.println(q); // howdy
Time of Update: 2017-02-27
從表面看,不變類的建立似乎是一個好方案。但是,一旦真的需要那種新類型的一個修改的對象,就必須辛苦地進行新對象的建立工作,同時還有可能涉及更頻繁的垃圾收集。對有些類來說,這個問題並不是很大。但對其他類來說(比如String類),這一方案的代價顯得太高了。為解決這個問題,我們可以建立一個“同志”類,並使其能夠修改。以後只要涉及大量的修改工作,就可換為使用能修改的同志類。完事以後,再切換回不可變的類。因此,上例可改成下面這個樣子: //: