1. 程式人生 > 其它 >javaGUI學習23:AWT-Component類

javaGUI學習23:AWT-Component類

技術標籤:javaGUIjava

1、構件

在AWT 1.1中,所有的標準AWT構件都是重量構件,即每個構件在本地不透明的視窗中顯示。雖然AWT1.1為開發輕量自定義構件°提供框架,但是它不能提供任何特定的輕量構件。所有存在的重量構件的輕量版本將在以後的 AWT版本中提供。
所有的標準AWT構件都具有本地的、依賴於平臺的同位體,做許多幕後的工作。實現基於同位體的設計,能使AWT的原來開發者迅速地開發使用者介面工具,該使用者介面工具跨平臺保留本地外觀。但是,即使大多數開發者都不直接處理同位體,當使用AWT開發使用者介面時,同位體方法仍然引起許多困難。構件的Swing集提供重量AWT構件的無同位體的版本給開發者,這樣可以開發者不採用基於同位體的方法。

構件超類描述
ButtonComponent觸發行為的文字按鈕
CanvasComponent繪製圖形的畫布
CheckboxComponent可檢驗的布林構件
ChoiceComponent文字輸入的彈出選單
DialogWindow可模式化視窗
FiledialogDialog選擇檔案的相關平臺對話方塊
FrameWindow具有標題欄和可選選單的頂層視窗
LabelComponent顯示字串的構件
ListComponent文字輸入的可滾動列表
ListContainer一般構件容器
PanelComponent滾動專案的adjustable構件
ScrollbarContainer可滾動容器
ScrollpaneTextComponent多行可滾動的文字框
TextareaComponentTextArea和TextField的基本功能
TextComponentTextComponent輸入文字的單行構件
WindowContainer沒有標題的無邊界視窗

2、java.awt.Component

每個AWT構件最終都是 java.awt.Component類的一個擴充套件。java.awt .Component是一個抽象類,它封裝了AWT構件的通用功能。實際上,有很多的功能被嵌人到Component類中,以致於它可以至少提供120種公共方法。我們不逐個討論每種方法,而是把焦點集中在常見的可能處理的構件基本特徵上。

3、構件的屬性

屬性方法
背景顏色void setBackground ( Color)
Color getBackground
邊界void oetBounds ( Rectangle)
void setBounds ( int,int,int,int)
Rectangle getBounds ()
游標void setCursor ( Cursor)
Cursor getCursor ()
拖放目標void setDropTarget ( DropTarget )
DropTarget getDropTarget ()
使能void setEnabled (boolean)
boolean isEnabled ()
字型void setFont ()
Font getFont ()
前景顏色void setForeground ( Color)
Color getForeground ()
地區void setLocale ( Locale)
Locale getLocale ()
位置void setLocation (Point)
void setLocation (int,int)
Point getLocation ()
Point getlocationOnScrcen ()
名稱void setName ()
String getNane ()
尺寸void setSize ( Dimension)
Dimension getSize ( )
可見性void setVisible ( boolean)
boolean isVisible ()

4、不贊成的方法

不支援的方法帶有deprecation選項。詳細查詢javaAPI或者《java2圖形設計卷1:AWT》

5、構件的位置,邊界和座標

構件的位置是相對於它的容器的,但是它的邊界表示構件的真實畫素寬度和高度。如果希望找出構件的實際螢幕座標,使用AWT1.1版本中引人的新方法:

Point java . awt.Component . getLocationOnScreen ()

構件方法中使用的座標是相對於構件的左上角的。例如,如果希望在畫布上畫-一-個矩形,並規定矩形的位置為(10,10),那麼矩形左上角將定位在畫布的左上角向下向右各10個畫素的地方。

6、構件的首選、最小和最大尺寸

構件可以通過分別覆蓋getPreferredSize ()、getMinimumSize ()和getMaximumSize ())規定它們的首選、最小和最大尺寸。
上面列出的覆蓋方法不能保證構件的尺寸。這些方法只不過是指導方針,可能被設定構件尺寸的物件—佈局管理器忽略。

7、構件的可見性和響應

除了框架、視窗和對話方塊以外的所有構件都是預設可見的。可以使用java. awt.Component的 setVisible方法設定單個構件的可見性。如果需要切換一組構件的可見性,應該考慮使用CardLayout佈局管理器代替單獨管理每個構件的可見性。
也可以通過呼叫setEnabled方法,分別傳遞true或false,以允許或禁止構件對使用者的輸入做出響應。當構件不允許進行響應時,應提供與平臺相關的視覺反饋。

8、構件和同位體

對於大部分開發者而言,不需要直接處理同位體。但是,如果在構件的同位體建立以前呼叫Component方法,那麼一些Component方法的執行將不同。
同位體在構件的addNotify方法中建立。如果必須在構件的同位體建立以前呼叫下面的方法,那麼基本上有兩種選擇。可以直接呼叫addNotify(),這樣可能導致構件同位體的建立;或覆蓋addNotify(),並且在呼叫super. addNotify ()以後呼叫依賴同位體的方法。

方法在同位體建立以前的行為表現
Image createImage ( int,int)返回null
ColorModel getColorModel )返回工具箱的顏色模式——不是構件的
Font getFont ()返回null
FontMetrics getFontMetrics ()返回工具箱的字型尺度-—不是構件的
Graphics getGraphics ()返回null
Insets getInsets ()返回空白區(0,0,0,0)
Dimension getPreferredSize ( )返回最小尺寸——不是首選尺寸
Dimension getMinimumSize ( )返回getSize ()的值
Dimension getSize ( )如果構件被明確規定尺寸,則返回它的大小;否貝個零寬度和高度的 Dimension
Toolkit getToolkit()返回預設的工具箱—–不是構件的
boolean isFocusTraversable ()返回false
boolean isValid ()返回false
boolean icShowing ()返回false
Point getLocationOnScreen ()丟擲IllegalComponentSateException異常
void requestFocus ()空操作

同位體的前景:
構件的Swing集為AWT重量構件提供無同位體的代替。雖然同位體方法可跨平臺保留本地化外觀,但是相對於所能解決的問題,同位體通常導致更多的問題。

9、顯示構件

在paint (Craphics)方法中顯示構件時,一般是在下面的兩種環境中進行呼叫:

  • 產生一個系統繪製或更新事件。
  • 顯式呼叫repaint ()。

只要構件所在視窗的處理結果需要重繪構件,那麼就會產生系統繪製和更新事件。例如,如果一個applet視窗被另一個視窗覆蓋,隨後又被移到前面,那麼產生一個PaintEvent事件並把它傳給需要重繪的applet中的構件。
當更新構件的圖形表示時,repaint ()經常被顯式呼叫,有時是構件自己呼叫。
在構件的同位體中, repaint()的所有過載版本都呼叫paint 方法。如果重繪的構件是輕量構件,則沿著構件的容器層次呼叫直到發現重量容器為止,並且呼叫容器同位體的paint 方法。

void repaint() //儘可能快的呼叫update()
void repaint(int x, int y, int width, int height) //儘可能快的呼叫update(),只重繪指定矩形的構件
void repaint() //儘可能快的呼叫update()
void repaint() //儘可能快的呼叫update(),只重繪指定矩形內的構件

呼叫同位體的repaint方法最終導致對構件的update方法的訪問。那麼對repaint () 的訪問將引起下面一系列訪問:

repaint() -> peer. repaint() -> update ()-> paint()

Component . update清除重量構件的背景,隨後呼叫構件的paint方法。如果重量構件需要連續地更新——例如,一個可滾動的視窗或動畫畫布——那麼應該覆蓋update ()以簡單地呼叫paint ( )。取消構件的清除可以減少閃爍。
一個應該提及的警告是關於覆蓋update ()以呼叫paint ()的。如果一個本地視窗系統的繪製事件呼叫update (),那麼很可能不管如何實現update (),視窗系統都將清除構件的背景。例如,如果構件為避免清除背景而覆蓋它的 update方法,那麼顯式呼叫repaint () (和由此導致的最終呼叫update ())將重繪構件而不用清除背景。但是,如果構件所在的視窗1被覆蓋,然後再次出現在前面,那麼本地視窗系統可能在呼叫update ()以前清除視窗的背景。

ps:

覆蓋update()以避免閃爍
Component . update ()首先清除構件的背景(如果它是重量構件),然後呼叫paint()方法。如果重量構件被repaint ()更新並將最終導致對update ()的訪問,則可能引起閃爍。為減少和清除背景有關的閃爍,覆蓋update ()以呼叫paint () 可以不用清除構件的背景。

10、構件和zorder

在初始版本的AWT中,沒有構件深度或zorder(三維座標系,z軸代表第三維)的概念。在AWT 1.1中,zorder的定義是構件從前向後加入到容器中的順序。第一個加人到容器中的構件是最前面的構件,而最後一個加入到容器中的構件將顯示在容器中的所有其他構件的後面。

11、構件和游標

在AWT中,支援設定構件游標的能力。為了設定構件的游標,傳遞Cursor 的例項給構件的 selCoursor方法。Cursor類具有一組預先定義的游標,可以通過呼叫Cursor .getPredefinedCursor(講行訪問。下面列出的整數常數代表這些預定義游標。

Cursor類欄位:

static int CROSSHAIR_CURSOR //十字游標型別。  
static int CUSTOM_CURSOR //與所有自定義遊標關聯的型別。  
static int DEFAULT_CURSOR //預設游標型別(如果未定義游標,則設定)。  
static int E_RESIZE_CURSOR //東調整大小的遊標型別。  
static int HAND_CURSOR //手形游標型別。  
static int MOVE_CURSOR //移動游標型別。  
static int N_RESIZE_CURSOR //北調整大小的遊標型別。  
protected String name //使用者可見的游標名稱。  
static int NE_RESIZE_CURSOR //東北調整大小的遊標型別。  
static int NW_RESIZE_CURSOR //西北調整大小的遊標型別。  
protected static Cursor[] predefined //已過時。 從JDK 1.7版開始,應該使用getPredefinedCursor(int)方法。  
static int S_RESIZE_CURSOR //南調整大小的遊標型別。  
static int SE_RESIZE_CURSOR //東南調整大小的遊標型別。  
static int SW_RESIZE_CURSOR //西南調整大小的遊標型別。  
static int TEXT_CURSOR //文字游標型別。  
static int W_RESIZE_CURSOR //西方調整大小的遊標型別。  
static int WAIT_CURSOR //等待游標型別。 

方法:

static Cursor getDefaultCursor() //返回系統預設游標。  
String getName() //返回此遊標的名稱。  
static Cursor getPredefinedCursor(int type) //返回具有指定預定義型別的遊標物件。  
static Cursor getSystemCustomCursor(String name) 返回與指定名稱匹配的特定於系統的自定義遊標物件。  
int getType() //返回此遊標的型別。  
String toString() //返回此遊標的字串表示形式。  

12、構件和序列化

AWT構件為序列化提供內部支援。實際上,很多語句都是Java語言為支援序列化而提供的,AWT構件可以利用這種支援的。AWT為序列化和構件有關的事件監聽者提供額外的支援。

例如:開始時包含一個按鈕。當啟用該按鈕時,按鈕的監聽者序列化按鈕並寫入一個檔案中。接著,監聽者從檔案中讀出序列化按鈕,併產生一-個新按鈕新增到框架中。

ps:

如果希望監聽者和它們的構件一起被序列化,讓監聽者實現 java. io.Se-rializable
如果希望序列化和構件相關聯的監聽者,那麼必須確保監聽者實現 java. io. Seri-alizable。所有的AWT構件自身都實現序列化介面,因此擴充套件AWT構件的自定義構件不需要顯式實現序列化介面。但是,既然監聽者預設的是不需要執行序列化,那麼如果希望構件的監聽者和構件一起被序列化,就必須人為地進行處理。

13、構件和國際化

13.1 Locale

Locale是表示指定地理、政治或文化區域的標誌。java. util . Locale類提供許多公共Locale例項。

它們僅僅是一個標誌符——沒有其他任何意義。例如,可以設定文字框的Locale為Locale . French。

ToxtField . field = new TextField ( );
field . setLocale (Locale . FRENCH);

但是,這並不意味著文字框將用法文顯示它的文字。而是我們已經將文字框標識為一個應該用法文顯示其文字的構件。確保它的文字用法文顯示不是文字框的職責——-這個職責留給了其他人,即需要你去管理。國際化討論的其餘部分將集中在這個職責上。

13.2 資源包

資源包(resource bundie〉含有可以在執行時載入的特定地區資料。例如,在資源包中,包含一對關鍵字/值。

所有的資源包(最終來自java. util . ResourceBundle的類)都包含關鍵字/值對,關鍵字標誌特定地區物件。

13.3 資源包屬性

為替代實現資源包類,資源可以在一個屬性檔案中被規定。屬性檔案具有. properties副檔名幷包含關鍵字/值對。例如,下面的屬性檔案LabelsBundle _ en . properties可以替代 IabelsBun-dle __ en類:

Simplel8N English Property Bundle
ldentifier = English Gul

屬性檔案中以#開始的行被認為是註釋行,可以被忽略。同樣,IabelsBundle _ fr. properties檔案可以替代IabelsBundle _ fr類:

#Simplel18N French Property Bundle
Identifier = Gul en Francais

當查詢資源包時,如果沒有在當前CLASSPATH 找到.class 檔案,那麼查詢帶有.properties副檔名的同名屬性檔案。如果找到屬性檔案,則例項化PropertyresourceBundle並且從Resource-Bundle.getBundle ()的呼叫中返回。PropertyresourceBundle是 ResourceBundle 的擴充套件,這意味著可以呼叫它的getObject方法獲得一個和標誌符相關的物件。
因此,可以不實現資源包類,而使用屬性檔案規定相關地區字串。

13.4 從國際化程式碼中分離出GUI

如果希望提供一個義大利版本的GUI,只需要實現返回義大利版本標誌符的IabelsBundle _ it類,並確保LabelsBundle _ it所位於的.class 檔案在當前CLASSPATH中。

13.5 可用地區和兩個字元的編碼

Locale .

CANADA 適用於國家的常數。  //CA
CANADA_FRENCH 適用於國家的常數。  
CHINA 適用於國家的常數。  //CN
CHINESE 有用的語言常量。  //zh
ENGLISH 有用的語言常量。  //en
FRANCE 適用於國家的常數。  //FR
FRENCH 有用的語言常量。  //fr
GERMAN 有用的語言常量。  //de
GERMANY 適用於國家的常數。  //DE
ITALIAN 有用的語言常量。  //it
ITALY 適用於國家的常數。  //IT
JAPAN 適用於國家的常數。  //JP
JAPANESE 有用的語言常量。  //jp
KOREA 適用於國家的常數。  //KP
KOREAN 有用的語言常量。  //ko
PRC 適用於國家的常數。  
SIMPLIFIED_CHINESE 有用的語言常量。  
TAIWAN 適用於國家的常數。  //TW
TRADITIONAL_CHINESE 有用的語言常量。  
UK 適用於國家的常數。   //UK
US 適用於國家的常數。  //US

14、約束屬性

約束屬性(bound property)是當它們的值改變時會引起通知的屬性。通知採用PropertyChangeEvent格式,把 PropertyChangeEvent傳送給已經註冊對這種屬性變化感興趣的 PropertyChangeListener的一個列表處理,使用術語“約束屬性”是因為一個約束屬性的改變,和一組被通知屬性改變的 PropertyChangeListener相關。

public void addPropertyChangeListener( PropertyChangeListener )//向構件維護的監聽者列表註冊指定的 PropertyChangeListener
public void rernovePropertyChangeListener ( PropertyChangeListener)//從構件維護的監聽者列表中刪去指定的PropertyChange-L.istener

public void assPropertyChangeListener ( String,PropertyCahngeListener)//為命名屬性註冊指定的PropertyChangeListener

public void removePropertyChangelistener ( String,PropertyChangeListener)//從和命名屬性有關的監聽者列表中刪去指定的PropertyChangelistener
protected void firePropertyChange ( String,Object oldValue,Object newValue)//為具有指定舊值和新值的命名屬性,激發一個屬性改變到適當的 PropertyChangelistener

java. beans.PropertyChangeListener是一個簡單的介面,只定義了一個方法:

propertyChange ( PropertyChangeEvent e)

PropertyChangeListener可以向整個構件註冊。當改變構件的任何約束屬性值時,呼叫監聽者的 propertyChange方法。
另外,可以向某個屬性註冊 PropertyChangeListener,只有當具有適當名稱的屬性改變時,才通知 PropertyChangeListener。
除了為實現約束屬性提供基本結構以外,也約束下列和java.awt.Component有關的屬性:

  • 字型。
  • 前景顏色。
  • 背景顏色。

自定義構件屬性約束,查閱《java2圖形卷1:AWT》

15、構件和樹鎖定

Component類例項化一個static final Object。這個物件稱為樹鎖定( tree lock),可以用來同步訪問構件的容器層次結構和佈局方法。阻止兩個執行緒同時訪問一個構件的容器層次結構(和佈局方法)的思想可能會引起沒有同步的訪問方法處於不相容狀態。