57

JAVA 2 新觀念教本

  • Upload
    nansen

  • View
    87

  • Download
    0

Embed Size (px)

DESCRIPTION

JAVA 2 新觀念教本. --- 邁向 SCJP 專業認證 ---. 易瓏資訊 林新德 著. 第 15 章 AWT 視窗程式設計. Java 的圖形化使用者介面 AWT 元件的繼承關係 容器 事件的處理 AWT 基本元件 版面配置. 15-1 Java 的圖形化使用者介面. 15-1 Java 的圖形化使用者介面. Microsoft Word的一個擷取畫面,可以看到其組成包括選單(Menu)、文字列(TextField)及按鈕(Button)等元件。. 15-1-1  認識圖形化使用者介面. 15-1 Java 的圖形化使用者介面. - PowerPoint PPT Presentation

Citation preview

Page 1: JAVA 2  新觀念教本
Page 2: JAVA 2  新觀念教本

第 15章AWT 視窗程式設計

Java 的圖形化使用者介面AWT 元件的繼承關係

容器事件的處理AWT 基本元件版面配置

Page 3: JAVA 2  新觀念教本
Page 4: JAVA 2  新觀念教本

15-1-1 認識圖形化使用者介面Microsoft Word的一個擷取畫面,可以看到其組成包括選單(Menu)、文字列( TextField)及按鈕( Button)等元件。

Page 5: JAVA 2  新觀念教本

15-1-1 認識圖形化使用者介面

舊的圖形介面工具 AWT ( Abstract Window Toolkit)

Java Foundation Classes 包括的部份:

新的圖形介面工具 Swing

整合工具 Accessibility API

高品質繪圖功能的 2D API

拖曳功能( drag and drop)的 API

Page 6: JAVA 2  新觀念教本

15-1-2  AWT

AWT使用大家都有的功能

Unix-likeGUI

WindowsGUI

AWT

Page 7: JAVA 2  新觀念教本

15-1-2  AWT

AWT元件在不同作業系統的外觀不同

AWT按鈕

Unix-like GUI Windows GUI

AWT元件Windows GUI

對等元件Unix-like GUI

對等元件

Page 8: JAVA 2  新觀念教本

幾乎無法延伸子類別

AWT 的缺點:

在不同系統上外觀相異

消耗較多的系統資源

15-1-2  AWT

AWT 直接和視窗作業系統溝通,所以元件初始化之後,其執行的速度會比 Swing 快一些。

Page 9: JAVA 2  新觀念教本

可以利用擴充子類別改進元件的功能

Swing 的優點:

固定的外觀

耗用較低的系統資源

15-1-3  Swing

Swing 和一般的 Java 工具一樣擁用跨平台的優點,然而也有著相同的缺點,就是較慢一點點。

Page 10: JAVA 2  新觀念教本
Page 11: JAVA 2  新觀念教本

15-2-1  Component的延伸類別Object

Panel

TextComponent

Scrollbar

List

Label

Container

Choice

Checkbox

Canvas

ButtonComponent

Window

Applet

Frame

TextArea

TextField

Dialog

Page 12: JAVA 2  新觀念教本

15-2-2 MenuComponent的延伸類別

Object

MenuBar

MenuItemMenuComponent Menu

CheckboxMenuItem

Page 13: JAVA 2  新觀念教本

15-2-2 MenuComponent的延伸類別以「記事本」為例說明選單及其相關元件

MenuBar

MenuMenuItem

CheckboxMenuItem

Page 14: JAVA 2  新觀念教本

15-2-3 建立 GUI的步驟建立元件

將元件加入容器

配置容器內元件的位置

處理由元件所產生的事件

Page 15: JAVA 2  新觀念教本
Page 16: JAVA 2  新觀念教本

Container的延伸類別

PanelContainer

Window

Applet

Frame

Dialog

Page 17: JAVA 2  新觀念教本

Frame類別可以建立圖形化系統的視窗,通常稱之為框架。

一個程式可以擁有一個以上的框架。

Frame是 AWT的頂層元件。

15-3-1  Frame

Frame顯示有邊框的視窗,邊框的標題列可以讓使用者在螢幕上拖曳整個框架,也可以由邊框改變框架的大小。

Page 18: JAVA 2  新觀念教本

Frame的建構子及常用方法15-3-1  Frame

Frame建構子或方法 說明Frame() 建立框架。Frame(String title) 建立標題為 title 的框架。int getState() 取得狀態,若為最小化則取得 Fram

e.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 。

Page 19: JAVA 2  新觀念教本

15-3-2  Panel

Panel的預設版面管理員為 FlowLayout 。

FlowLayout會將容器中的元件依照元件的偏好大小,從左至右、由上到下排列。

Panel和檔案目錄夾的概念是一樣的,可以有巢狀的結構。

Page 20: JAVA 2  新觀念教本

15-3-3  Dialog

Dialog物件也是頂層元件,不過它必須依附在Frame或其它 Dialog 上。

Dialog物件的主要用處是當做對話的小視窗,其邊框上只有關閉按鈕,沒有最小化或最大化的按鈕。

Dialog的預設版面管理員為 BorderLayout。

Page 21: JAVA 2  新觀念教本
Page 22: JAVA 2  新觀念教本

15-4-1 事件事件( event)其實是就是一種物件。

元件透過傳送事件物件( event object )的方式,傳達使用者按下滑鼠按鈕或鍵盤按鍵等事件。

事件本身就存在特定的事件資訊,接收事件的傾聽者可以由事件的資訊進行處理。

欲讓事件能順利由來源元件傳送給傾聽者處理,必須將傾聽者指定給元件(相當於一種註冊動作)。

AWT元件可以使用的事件和傾聽者都包含在java.awt.event套件裡。

Page 23: JAVA 2  新觀念教本

15-4-2 傾聽者每個傾聽者都必須實作傾聽者介面或是繼承自轉接者( Adapter )。

轉接者為實作傾聽者介面的類別,其定義的傾聽者方法都是空方法,不對事件作任何處理。

傾聽者介面都以 Listener為識別字尾,而轉接者都以 Adapter為識別字尾

傾聽者方法都是以 void 定義,參數為事件,不回傳任何值。

Page 24: JAVA 2  新觀念教本

15-4-3 事件的傳送元件加入傾聽者是使用 add???Listener()方法, ???表示某種型態的事件。

元件解除和傾聽者之間的關係,不再將發生的事件傳給傾聽者,使用 remove???Listener()方法。

一個事件來源可以將事件傳送給多個傾聽者,而多個不同來源的事件也可以傳送給單一個傾聽者。

Page 25: JAVA 2  新觀念教本

15-4-3 事件的傳送傾聽者和來源物件沒有一對一的限定

來源物件

傾聽者一

傾聽者二

傾聽者三

來源物件二 傾聽者

來源物件一

來源物件三

Page 26: JAVA 2  新觀念教本

15-4-4 傾聽者介面容器的傾聽者介面

所有容器的傾聽者介面 傾聽者方法ContainerListener componentAdded()

componentRemoved()

Page 27: JAVA 2  新觀念教本

所有元件的傾聽者介面 傾聽者方法ComponentListener componentResized()

componentMoved()componentShown()componentHidden()

FocusListener focusGained()focusLost()

KeyListener keyTyped()keyPressed()keyRelease()

MouseListener mouseClicked()mousePressed()mouseReleased()mouseEntered()mouseExited()

MouseMotionListener( 與 MouseListener 傾聽相同的事件 MouseEvent)

mouseDragged()mouseMoved

Page 28: JAVA 2  新觀念教本

傾聽者介面 傾聽者方法 事件來源元件ActionListener actionPerformed() Button

ListTextField

AdjustmentListener adjustmentValueChanged() ScrollBar

ItemListener itemStateChanged() CheckBoxChoiceList

TextListener textValueChanged () TextFieldTextArea

WindowListener windowActivated()windowClosed()windowClosing()windowDeactivated()windowDeiconified()windowIconified()windowOpened()

FrameDialog

Page 29: JAVA 2  新觀念教本

15-4-4 傾聽者介面MyWindowClosing.java :需要在框架上的關閉鈕加入離開程式的功能時,可以建立 MyWindowClosing物件並設定給框架作為傾聽者。

import java.awt.*;import java.awt.event.*;class MyWindowClosing extends WindowAdapter{

void windowClosing(WindowEvent e){System.exit(0);

}}

Page 30: JAVA 2  新觀念教本
Page 31: JAVA 2  新觀念教本

15-5-1  Label和 Button元件Label的建構子或方法

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 。

Page 32: JAVA 2  新觀念教本

15-5-1  Label和 Button元件Button的建構子或方法

Button的建構子或方法 說明Button() 建立沒有文字的按鈕。Button(String label) 建立文字為 label 的按鈕。String getActionCommand() 取得按下按鈕所傳達的指令。String getLabel() 取得按鈕上的文字。void setActionCommand(String command)

設定按鈕所傳達的指令為 command 。

void setLabel(String label) 設定按鈕上的文字為 label 。

Page 33: JAVA 2  新觀念教本

15-5-2   Checkbox元件Checkbox元件的兩種外觀

四方形的為獨立的核選盒,當其它的核選盒狀態改變時並不會影響到該核選盒。圓形的核選盒( radio button)屬於某個CheckboxGroup。

Page 34: JAVA 2  新觀念教本

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) 設定核選盒的選取狀態。

Page 35: JAVA 2  新觀念教本

15-5-3   TextField與 TextArea元件TextComponent的常用方法

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 。

Page 36: JAVA 2  新觀念教本

15-5-3   TextField與 TextArea元件TextField建構子及方法

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) 設定反應的字元。一般用在密碼

輸入列。

Page 37: JAVA 2  新觀念教本

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 。

Page 38: JAVA 2  新觀念教本

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 的項目。

Page 39: JAVA 2  新觀念教本

15-5-5   List元件List建構子及方法 說明List() 建立表列。List(int rows) 建立顯示的列數為 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時可以多選。

Page 40: JAVA 2  新觀念教本

15-5-6   Canvas元件

Canvas 元件:用來顯示繪圖結果的元件。

Canvas元件可以利用 getGraphics()方法取得一個Graphics物件,透過 Graphics物件的方法就可以畫出幾何圖形或影像。

Page 41: JAVA 2  新觀念教本

15-5-7   Scrollbar元件

捲軸的性質

最小值 最大值值

可見量A B

Page 42: JAVA 2  新觀念教本

15-5-7   Scrollbar元件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 的捲軸。

Page 43: JAVA 2  新觀念教本

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。

Page 44: JAVA 2  新觀念教本

15-5-8   使用選單

框架可以加入一個選單列( MenuBar )。

選單列裡可以有數個選單( Menu )。

選單內又可以有數個選項( MenuItem )和核選式選項( ChechboxMenuItem )。

點選選項時,會發生 ActionEvent ,可以使用 ActionListener 傾聽;點選核選式選項時,則是發生 ItemEvent ,可以使用 ItemListener 傾聽。

Page 45: JAVA 2  新觀念教本
Page 46: JAVA 2  新觀念教本

配置管理員會依循特別的配置規則,按照容器的大小,動態配置元件的位置,並不會將元件固定在確切的位置上

配置管理員有五種,分別屬於不同的類別:FlowLayout(循序配置)、 BorderLayout(邊緣配置)、 GridLayout(格式配置)、 GridBagLayout(格群配置)和CardLayout(卡式配置)。巢狀的配置管理搭配 Panel 使用,可以製作出複雜的版面配置。

Page 47: JAVA 2  新觀念教本

15-6-1   FlowLayout

FlowLayout是 Panel的預設配置管理員。

預設的 FlowLayout會把元件放在中央,當容器的寬度不夠放時,才將後續的元件往下擺放,而且元件間的空白距離垂直和水平方向皆為 5個像素。

指定配置管理員給容器時,可以利用 Container的setLayout()方法來設定,其參數為LayoutManager物件即可。

Page 48: JAVA 2  新觀念教本

15-6-1   FlowLayout

FlowLayout建構子和方法

FlowLayout建構子和方法 說明FlowLayout() 建立循序配置管理員。FlowLayout(int align) 建立依 align 排列的循序配置管理員。 a

lign 可以為 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 。

Page 49: JAVA 2  新觀念教本

15-6-2   BorderLayout

BorderLayout 會將收納器分成,東、西、南、北、中,五個區域,每個區域只能放入一個元件,所以最多只能放入五個元件。

每個區域也可以放入收納器,是很方便的配置管理員。

加入元件時,第二個參數指定放置元件的區域,“如 East” “、 West” “、 South” “、 North” “或 Ce

nter”。

Page 50: JAVA 2  新觀念教本

15-6-2   BorderLayout

“North” “和 South” 區的元件會和容器同寬,高度為元件的偏好高度。

“East” 和 “West” 區的元件寬度為偏好寬度,高度為容器高減去南北兩區元件的高度。

“Center” 區的元件大小則是減去東西南北四區元件所佔的空間,剩下的部份就是該區元件的大小。

BorderLayout 的配置規則:

Page 51: JAVA 2  新觀念教本

15-6-2   BorderLayout

BorderLayout建構子和方法

BorderLayout建構子和方法 說明BorderLayout() 建立邊緣配置管理員。BorderLayout(int hgap, int vgap) 建立元件間的水平距離為 hgap 、

垂直距離為 vgap 的配置管理員。void setHgap(int hgap) 設定元件間的水平距離為 hgap 。void setVgap(int vgap) 設定元件間的垂直距離為 vgap 。

Page 52: JAVA 2  新觀念教本

15-6-3   GridLayout

GridLayout是相當制式的配置管理員,它會將容器畫分成格子狀的區域,然後將元件以固定的大小放置。

格子的大小並不是完全由 GridLayout 設定的列數和行數決定,也和元件的數目有關。先符合行數,再視元件的數目調整列數。

行數和列數固定時,元件的大小會和收納器的大小成正比關係。

Page 53: JAVA 2  新觀念教本

15-6-3   GridLayout

GridLayout建構子和方法GridLayout建構子和方法 說明GridLayout() 建立格式配置管理員。GridLayout(int rows, int cols) 建立列數為 rows 、行數為 cols 的

格式配置管理員。GridLayout(int rows, int cols, int hgap, int vgap)

建立列數為 rows 、行數為 cols 的格式配置管理員。

void setColumns(int cols) 設定配置行數為 cols 。void setHgap(int hgap) 設定元件間水平距離為 hgap 。void setRows(int rows) 設定配置列數為 rows 。void setVgap(int vgap) 設定元件間垂直距離為 vgap 。

Page 54: JAVA 2  新觀念教本

15-6-4   GridBagLayout

GridBagLayout 比 GridLayout 要來得有彈性,相對地也比較複雜和麻煩。

元件的位置及大小就是由 GridBagConstraints物件所控制,而且 GridBagConstraints 還會影響容器的格子行數及列數。

在設定格群配置後,使用 add() 方法加入元件的同時,除了以元件本身為參數外,還需要傳入一個 GridBagConstraints 物件。

Page 55: JAVA 2  新觀念教本

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 。

Page 56: JAVA 2  新觀念教本

15-6-5   CardLayout

CardLayout就如其名,像卡片那樣一張張地疊在一起,而每次只能看到其中的一張卡片。

通常使用 CardLayout 時,還需要使用其它的控制元件(如按鈕)來控制「翻頁的動作」。

CardLayout 可以管理許多元件,一個元件(或子容器)放在「一張卡片」裡,每個元件的大小和收納器一樣大,因此,每次只能看到某一個元件,必須「翻頁」才能看到下一張卡片的內容。

Page 57: JAVA 2  新觀念教本

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 的那一頁。