JAVA 2 新觀念教本 ---邁向SCJP專業認證--- 易瓏資訊 林新德 著
第15章 AWT視窗程式設計 Java的圖形化使用者介面 AWT元件的繼承關係 容器 事件的處理 AWT基本元件 版面配置
15-1 Java的圖形化使用者介面
15-1 Java的圖形化使用者介面 15-1-1 認識圖形化使用者介面 15-1-1 認識圖形化使用者介面 Microsoft Word的一個擷取畫面,可以看到其組成包括選單(Menu)、文字列(TextField)及按鈕(Button)等元件。
15-1 Java的圖形化使用者介面 15-1-1 認識圖形化使用者介面 Java Foundation Classes包括的部份: 15-1-1 認識圖形化使用者介面 Java Foundation Classes包括的部份: 舊的圖形介面工具AWT(Abstract Window Toolkit) 新的圖形介面工具Swing 整合工具Accessibility API 高品質繪圖功能的2D API 拖曳功能(drag and drop)的API
15-1 Java的圖形化使用者介面 15-1-2 AWT AWT使用大家都有的功能
15-1 Java的圖形化使用者介面 15-1-2 AWT AWT元件在不同作業系統的外觀不同
15-1 Java的圖形化使用者介面 15-1-2 AWT AWT的缺點: 幾乎無法延伸子類別 在不同系統上外觀相異 消耗較多的系統資源 AWT直接和視窗作業系統溝通,所以元件初始化之後,其執行的速度會比Swing快一些。
15-1 Java的圖形化使用者介面 15-1-3 Swing Swing的優點: 可以利用擴充子類別改進元件的功能 固定的外觀 耗用較低的系統資源 Swing和一般的Java工具一樣擁用跨平台的優點,然而也有著相同的缺點,就是較慢一點點。
15-2 AWT元件的繼承關係
15-2 AWT元件的繼承關係 15-2-1 Component的延伸類別
15-2 AWT元件的繼承關係 15-2-2 MenuComponent的延伸類別
15-2 AWT元件的繼承關係 15-2-2 MenuComponent的延伸類別 以「記事本」為例說明選單及其相關元件
15-2 AWT元件的繼承關係 15-2-3 建立GUI的步驟 建立元件 將元件加入容器 配置容器內元件的位置 處理由元件所產生的事件
15-3 容器
15-3 容器 Container的延伸類別
15-3 容器 15-3-1 Frame Frame類別可以建立圖形化系統的視窗,通常稱之為框架。 一個程式可以擁有一個以上的框架。 Frame是AWT的頂層元件。 Frame顯示有邊框的視窗,邊框的標題列可以讓使用者在螢幕上拖曳整個框架,也可以由邊框改變框架的大小。
15-3 容器 15-3-1 Frame Frame的建構子及常用方法 Frame建構子或方法 說明 Frame() 建立框架。 Frame(String title) 建立標題為title的框架。 int getState() 取得狀態,若為最小化則取得Frame.ICONIFIED,若為正常狀態則會取得Frame.NORMAL。 void setIconImage(Image img) 設定小圖示為img。 void setMenuBar(MenuBar mb) 設定選單列為mb。 void setResizable(boolean rs) 設定是否可以調整大小。 void setState(int state) 設定狀態(請參考getState方法)。 void setTitle(String title) 設定標題為title。
15-3 容器 15-3-2 Panel Panel的預設版面管理員為FlowLayout。
15-3 容器 15-3-3 Dialog Dialog物件也是頂層元件,不過它必須依附在Frame或其它Dialog上。 Dialog的預設版面管理員為BorderLayout。
15-4 事件的處理
15-4 事件的處理 15-4-1 事件 事件(event)其實是就是一種物件。 15-4-1 事件 事件(event)其實是就是一種物件。 元件透過傳送事件物件(event object)的方式,傳達使用者按下滑鼠按鈕或鍵盤按鍵等事件。 欲讓事件能順利由來源元件傳送給傾聽者處理,必須將傾聽者指定給元件(相當於一種註冊動作)。 事件本身就存在特定的事件資訊,接收事件的傾聽者可以由事件的資訊進行處理。 AWT元件可以使用的事件和傾聽者都包含在java.awt.event套件裡。
15-4 事件的處理 15-4-2 傾聽者 每個傾聽者都必須實作傾聽者介面或是繼承自轉接者(Adapter)。 15-4-2 傾聽者 每個傾聽者都必須實作傾聽者介面或是繼承自轉接者(Adapter)。 轉接者為實作傾聽者介面的類別,其定義的傾聽者方法都是空方法,不對事件作任何處理。 傾聽者方法都是以 void定義,參數為事件,不回傳任何值。 傾聽者介面都以Listener為識別字尾,而轉接者都以Adapter為識別字尾
15-4 事件的處理 15-4-3 事件的傳送 元件加入傾聽者是使用add???Listener()方法,???表示某種型態的事件。 15-4-3 事件的傳送 元件加入傾聽者是使用add???Listener()方法,???表示某種型態的事件。 元件解除和傾聽者之間的關係,不再將發生的事件傳給傾聽者,使用remove???Listener()方法。 一個事件來源可以將事件傳送給多個傾聽者,而多個不同來源的事件也可以傳送給單一個傾聽者。
15-4 事件的處理 15-4-3 事件的傳送 傾聽者和來源物件沒有一對一的限定
15-4 事件的處理 15-4-4 傾聽者介面 容器的傾聽者介面 所有容器的傾聽者介面 傾聽者方法 ContainerListener 15-4-4 傾聽者介面 容器的傾聽者介面 所有容器的傾聽者介面 傾聽者方法 ContainerListener componentAdded() componentRemoved()
15-4 事件的處理 所有元件的傾聽者介面 傾聽者方法 ComponentListener componentResized() componentMoved() componentShown() componentHidden() FocusListener focusGained() focusLost() KeyListener keyTyped() keyPressed() keyRelease() MouseListener mouseClicked() mousePressed() mouseReleased() mouseEntered() mouseExited() MouseMotionListener (與MouseListener傾聽相同的事件MouseEvent) mouseDragged() mouseMoved
15-4 事件的處理 傾聽者介面 傾聽者方法 事件來源元件 ActionListener actionPerformed() Button TextField AdjustmentListener adjustmentValueChanged() ScrollBar ItemListener itemStateChanged() CheckBox Choice TextListener textValueChanged () TextArea WindowListener windowActivated() windowClosed() windowClosing() windowDeactivated() windowDeiconified() windowIconified() windowOpened() Frame Dialog
15-4 事件的處理 15-4-4 傾聽者介面 MyWindowClosing.java:需要在框架上的關閉鈕加入離開程式的功能時,可以建立MyWindowClosing物件並設定給框架作為傾聽者。 import java.awt.*; import java.awt.event.*; class MyWindowClosing extends WindowAdapter { void windowClosing(WindowEvent e){ System.exit(0); }
15-5 AWT基本元件
15-5 AWT基本元件 15-5-1 Label和Button元件 Label的建構子或方法 Label的建構子或方法 說明 建立空白標籤。 Label(String text) 建立標籤文字為text的標籤。 Label(String text, int alignment) 建立標籤文字為text,排放位置為alignment的標籤。alignment可以為Label的類別常數之一,LEFT、CENTER、RIGHT。 int getAlignment() 取得標籤文字的排放位置。 String getText() 取得標籤的文字內容。 void setAlignment(int alignment) 設定標籤文字的排放位置。 void setText(String text) 設定標籤文字的內容為text。
15-5 AWT基本元件 15-5-1 Label和Button元件 Button的建構子或方法 Button的建構子或方法 說明 建立沒有文字的按鈕。 Button(String label) 建立文字為label的按鈕。 String getActionCommand() 取得按下按鈕所傳達的指令。 String getLabel() 取得按鈕上的文字。 void setActionCommand(String command) 設定按鈕所傳達的指令為command。 void setLabel(String label) 設定按鈕上的文字為label。
15-5 AWT基本元件 15-5-2 Checkbox元件 Checkbox元件的兩種外觀 四方形的為獨立的核選盒,當其它的核選盒狀態改變時並不會影響到該核選盒。 圓形的核選盒(radio button)屬於某個CheckboxGroup。
15-5 AWT基本元件 15-5-2 Checkbox元件 Checkbox的建構子或方法 說明 Checkbox(String label) 建立文字為label的核選盒。 Checkbox(String label, boolean state) 建立文字為label,選取狀態為state的核選盒。state為true表示核選;為false表示未核選。 Checkbox(String label, Boolean state, CheckboxGroup group) 建立文字為label,選取狀態為state,並加入群組group的核選盒。 CheckboxGroup getCheckboxGroup() 取得所加入的核選盒群組。 String getLabel() 取得核選盒上的文字內容。 boolean getState() 取得核選盒狀態。 void setCheckboxGroup (CheckboxGroup g) 設定核選盒為某個核選盒群組g的成員。 void setLabel(String label) 設定核選盒文字內容。 void setState(boolean state) 設定核選盒的選取狀態。
15-5 AWT基本元件 15-5-3 TextField與TextArea元件 TextComponent的常用方法 說明 String getSelectedText() 取得選取的文字。 int getSelectionEnd() 取得選取的終點處。 int getSelectionStart() 取得選取的起始處。 String getText() 取得文字內容。 void select(int start, int end) 選擇start到end的文字。 void setEditable(boolean b) 設定是否為可以編輯。 void setSelectionEnd(int selectionEnd) 設定選取的終點處為selectionEnd。 void setSelectionStart(int selectionStart) 設定選取的起始處為selectionStart。 void setText(String t) 設定文字內容為t。
15-5 AWT基本元件 15-5-3 TextField與TextArea元件 TextField建構子及方法 說明 TextField(int columns) 建立大小約為columns個字元的文字列。 TextField(String text) 建立文字內容為text的文字列。 TextField(String text, int columns) 建立大小為columns,文字內容為text的文字列。 int getColumns() 取得文字列的大小。 void setColumns(int columns) 設定文字列的大小為columns。 void setEchoChar(char c) 設定反應的字元。一般用在密碼輸入列。
15-5 AWT基本元件 15-5-3 TextField與TextArea元件 TextArea建構子及方法 TextArea建構子及方法 說明 TextArea(int rows, int columns) 建立列數為rows、行數為columns的文字區。 TextArea(String text) 建立內容為text的文字區。 TextArea(String text, int rows, int columns) 建立列數為rows、行數為columns的文字區。建立內容為text的文字區。 void append(String str) 將字串str加在文字區內容後面。 int getColumns() 取得文字區的行數(每行可容納的字元數)。 int getRows() 取得文字區的列數。 void insert(String str, int pos) 在文字區內容的pos位置插入str字串。 void setColumns(int columns) 設定文字區的行數為columns。 void setRows(int rows) 設定文字區的列數為rows。
15-5 AWT基本元件 15-5-4 Choice元件 Choice類別常用的方法 說明 void addItem(String item) 從後面加入項目item。 String getItem(int index) 由項目索引index取得項目。 int getItemCount() 取得項目數。 int getSelectedIndex() 取得被選取的項目索引。 String getSelectedItem() 取得被選取的項目。 void insert(String item, int index) 在位置index處插入項目item。 void remove(int pos) 移除位置為pos的項目。 void remove(String item) 移除名稱為item的項目。 void select(int pos) 選擇位置為pos的項目。 void select(String str) 選擇名稱為str的項目。
15-5 AWT基本元件 15-5-5 List元件 List建構子及方法 說明 List() 建立表列。 List(int rows) List(int rows, boolean Mode) 建立顯示的列數為rows的表列。Mode若為true表示可以多選,為false表示只能單選。 void add(String item) 由後面加入項目item。 void add(String item, int index) 由位置index加入項目item。 String getItem(int index) 取得索引為index的項目。 int getItemCount() 取得項目數。 int getSelectedIndex() 取得被選取的索引(單選)。 int[] getSelectedIndexes() 取得被選取的索引陣列(多選)。 String getSelectedItem() 取得被選取的項目(單選)。 String[] getSelectedItems() 取得被選取的項目陣列(多選)。 boolean isIndexSelected(int index) 判斷索引為index的項目是否被選取。 void remove(int pos) 移除位置為pos的項目。 void remove(String item) 移除項目item。 void setMultipleMode(boolean b) 設定是否為多選模式。b為true時可以多選。
15-5 AWT基本元件 15-5-6 Canvas元件 Canvas元件:用來顯示繪圖結果的元件。 Canvas元件可以利用getGraphics()方法取得一個Graphics物件,透過Graphics物件的方法就可以畫出幾何圖形或影像。
15-5 AWT基本元件 15-5-7 Scrollbar元件 捲軸的性質
15-5 AWT基本元件 15-5-7 Scrollbar元件 Scrollbar的建構子 Scrollbar建構子 說明 建立預設的捲軸(方向為垂直、最小值為0、最大值為100、值為0、線增量為1、區增量為10)。 Scrollbar(int ori) 建立方向為ori的捲軸。ori可以為兩個類別常數之一,HORIZONTAL為水平方向,VERTICAL為垂直方向。其他的值為預設值。 Scrollbar(int orientation, int value, int visible, int min, int max) 建立方向為ori、值為value、可見量為visible、最小值為min、最大值為max的捲軸。
15-5 AWT基本元件 Scrollbar的常用方法 Scrollbar建構子及方法 說明 int getBlockIncrement() 取得區增量。 int getMaximum() 取得最大值。 int getMinimum() 取得最小值。 int getOrientation() 取得方向性。 int getUnitIncrement() 取得線增量。 int getValue() 取得目前的值。 int getVisibleAmount() 取得可見量。 void setBlockIncrement(int v) 設定區增量為v。 void setMaximum(int max) 設定最大值為max。 void setMinimum(int min) 設定最小值為min。 void setOrientation(int ori) 設定方向性為ori。 void setUnitIncrement(int v) 設定線增量為v。 void setValue(int v) 設定目前的值為v。 void setVisibleAmount(int a) 設定可見量為a。
15-5 AWT基本元件 15-5-8 使用選單 框架可以加入一個選單列(MenuBar)。 選單列裡可以有數個選單(Menu)。 15-5-8 使用選單 框架可以加入一個選單列(MenuBar)。 選單列裡可以有數個選單(Menu)。 選單內又可以有數個選項(MenuItem)和核選式選項(ChechboxMenuItem)。 點選選項時,會發生ActionEvent,可以使用ActionListener傾聽;點選核選式選項時,則是發生ItemEvent,可以使用ItemListener傾聽。
15-6 版面配置
15-6 版面配置 配置管理員會依循特別的配置規則,按照容器的大小,動態配置元件的位置,並不會將元件固定在確切的位置上 配置管理員有五種,分別屬於不同的類別:FlowLayout(循序配置)、BorderLayout(邊緣配置)、GridLayout(格式配置)、GridBagLayout(格群配置)和CardLayout(卡式配置)。 巢狀的配置管理搭配Panel使用,可以製作出複雜的版面配置。
15-6 版面配置 15-6-1 FlowLayout FlowLayout是Panel的預設配置管理員。 指定配置管理員給容器時,可以利用Container的setLayout()方法來設定,其參數為LayoutManager物件即可。
15-6 版面配置 15-6-1 FlowLayout FlowLayout建構子和方法 FlowLayout建構子和方法 說明 建立循序配置管理員。 FlowLayout(int align) 建立依align排列的循序配置管理員。align可以為FlowLayout的三個類別常數,CENTER、LEFT或RIGHT。 FlowLayout(int align, int hgap, int vgap) 建立依align排列、元件間的水平距離為hgap、垂直距離為vgap的配置管理員。 void setAlignment(int align) 設定排列方式為alighn。 void setHgap(int hgap) 設定元件間的水平距離為hfap。 void setVgap(int vgap) 設定元件間的垂直距離為vfap。
15-6 版面配置 15-6-2 BorderLayout BorderLayout會將收納器分成,東、西、南、北、中,五個區域,每個區域只能放入一個元件,所以最多只能放入五個元件。 每個區域也可以放入收納器,是很方便的配置管理員。 加入元件時,第二個參數指定放置元件的區域,如“East”、“West”、“South”、“North”或“Center”。
15-6 版面配置 15-6-2 BorderLayout BorderLayout的配置規則: “North” 和 “South” 區的元件會和容器同寬,高度為元件的偏好高度。 “East” 和 “West” 區的元件寬度為偏好寬度,高度為容器高減去南北兩區元件的高度。 “Center” 區的元件大小則是減去東西南北四區元件所佔的空間,剩下的部份就是該區元件的大小。
15-6 版面配置 15-6-2 BorderLayout BorderLayout建構子和方法 BorderLayout建構子和方法 說明 建立邊緣配置管理員。 BorderLayout(int hgap, int vgap) 建立元件間的水平距離為hgap、垂直距離為vgap的配置管理員。 void setHgap(int hgap) 設定元件間的水平距離為hgap。 void setVgap(int vgap) 設定元件間的垂直距離為vgap。
15-6 版面配置 15-6-3 GridLayout GridLayout是相當制式的配置管理員,它會將容器畫分成格子狀的區域,然後將元件以固定的大小放置。 行數和列數固定時,元件的大小會和收納器的大小成正比關係。 格子的大小並不是完全由GridLayout設定的列數和行數決定,也和元件的數目有關。先符合行數,再視元件的數目調整列數。
15-6 版面配置 15-6-3 GridLayout GridLayout建構子和方法 GridLayout建構子和方法 說明 建立格式配置管理員。 GridLayout(int rows, int cols) 建立列數為rows、行數為cols的格式配置管理員。 GridLayout(int rows, int cols, int hgap, int vgap) void setColumns(int cols) 設定配置行數為cols。 void setHgap(int hgap) 設定元件間水平距離為hgap。 void setRows(int rows) 設定配置列數為rows。 void setVgap(int vgap) 設定元件間垂直距離為vgap。
15-6 版面配置 15-6-4 GridBagLayout GridBagLayout比GridLayout要來得有彈性,相對地也比較複雜和麻煩。 在設定格群配置後,使用add()方法加入元件的同時,除了以元件本身為參數外,還需要傳入一個GridBagConstraints物件。 元件的位置及大小就是由GridBagConstraints物件所控制,而且GridBagConstraints還會影響容器的格子行數及列數。
15-6 版面配置 GridBagConstraints的屬性 GridBagConstraints的屬性 說明 int fill 元件填入格群的條件。此屬性可以利用GridBagConstraints類別常數來設定,包括BOTH、VERTICAL、HORIZONTAL、CENTER、EAST等。 int gridheight 元件高度相對於格子高之倍數。 int gridwidth 元件寬度相對於格子寬之倍數。 int gridx 元件所在的行數索引。 int gridy Insets insets Insets物件有四個屬性,top、left、bottom、right,分別表示元件四個邊和其它元件的距離。 double weightx 分配額外水平方向空間的權值。預設值為0.0,表示不取得額外的空間。值越大表示優先取得或減少空間。 double weighty 分配額外垂直方向空間的權值。參看weightx。
15-6 版面配置 15-6-5 CardLayout CardLayout就如其名,像卡片那樣一張張地疊在一起,而每次只能看到其中的一張卡片。 CardLayout可以管理許多元件,一個元件(或子容器)放在「一張卡片」裡,每個元件的大小和收納器一樣大,因此,每次只能看到某一個元件,必須「翻頁」才能看到下一張卡片的內容。 通常使用CardLayout時,還需要使用其它的控制元件(如按鈕)來控制「翻頁的動作」。
15-6 版面配置 第15章 結束 15-6-5 CardLayout CardLayout建構子和方法 CardLayout建構子和方法 說明 CardLayout(int hgap, int vgap) 建立水平距離為hgap、垂直距離為vgap的卡式配置管理員。 void first(Container parent) 翻到第一頁。parent為使用卡式配置之收納器。 void last(Container parent) 翻到最後一頁。 void next(Container parent) 翻往下一頁。 void previous(Container parent) 翻往前一頁。 void show(Container parent, String name) 翻到名稱為name的那一頁。 第15章 結束