天天看點

[筆記] 瘋狂JAVA講義(第3版)第11章 AWT程式設計

第11章 AWT程式設計

AWT(Abstract Window Toolkit),它是Sun最早提供的GUI庫,這個庫提供了一些基本功能。

後來又提供了Swing庫。

11.1 GUI(圖形使用者界面)和AWT

@Swing是建立在AWT基礎上的,他的事件處理機制使用的是AWT的。

和AWT相關的類放在java.awt包及其子包中,AWT程式設計有兩個基類:Component和MenuComponent。

Component代表一個圖形化可與使用者互動的對象。例如Button代表一個按鈕。

MenuComponent代表菜單元件,包括MenuBar(菜單條)、MenuItem(菜單項)等元件。

此外還有兩個重要概念:Container和LayoutManager。

Container是一種特殊的Component,代表一種容器,盛放普通Component。

LayoutManager是容器管理其他元件布局的方式。

11.2 AWT容器

Component提供了幾個方法了設定元件大小、性質、可見性。

setLocation(int x,int y)

setSize(int width,int height)

setBounds(int x,int y,int width, int height) //同時設定位置,大小

setVisible(Booean b) 設定可見性

容器(Container)還可以盛放其他元件,容器類提供了如下方法來通路容器内元件:

Component add(Component comp)

Component getComponent(int x,int y)

int getComponentCount()

Component[] getComponents()

AWT主要容器類型:

1、Window ,可獨立存在的頂級視窗

2、Panel , 容器,可容納其他元件,但不能獨立存在。必須添加到其他容器中。

Frame是Window的子類,Frame對象有标題,可拖拉改變視窗位置、大小。

初始化為不可見,通過setVisible(true) 使其顯示。

預設使用BorderLayout作為布局管理器。

Frame執行個體:

import java.awt.Frame;

public class FrameTest

{

public static void main(String[] args) {

Frame f = new Frame(“測試視窗”);

f.setBounds(30, 30, 250, 200);

f.setVisible(true);

}

}

上述代碼建立一個Frame視窗,但點選x按鈕時,無法關閉。因為還沒添加事件響應。

Panel是AWT中另一個典型容器,它不能獨立存在。外在表現為一個矩形區域,該區域内盛放其他元件。

預設使用FlowLayout作為布局管理器。

import java.awt.*;

public class PanelTest

{

public static void main(String[] args) {

Frame f = new Frame(“測試視窗”);

Panel p = new Panel();

p.add(new TextField(20));

p.add(new Button(“單擊”));

f.add§;

f.setBounds(30, 30, 250, 120);

f.setVisible(true);

}

}

ScrollPanel 帶滾動條,當元件空間過大,将産生滾動條。

預設使用BorderLayout作為布局管理器。

import java.awt.*;

public class ScrollPaneTest

{

public static void main(String[] args) {

Frame f = new Frame(“測試視窗”);

ScrollPane sp = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS);

sp.add(new TextField(20));

sp.add(new Button(“單擊我”));

f.add(sp);

f.setBounds(30,30,250,120);

f.setVisible(true);

}

}

将會産生滾動條,但顯示出按鈕。

11.3 布局管理器

LayoutMAnager根據運作平台調整元件大小。

所有AWT容器都有預設的布局管理器。

為容器設定布局管理器通過調用setLayout(LayoutManage LM)實作

c.setLayout(new XxxLayout());

11.3.1 FlowLayout布局管理器

元件像水流一樣流動排列,遇到邊界就傳回,重頭排列。

預設從左到右,遇到邊界就來到下一行。

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-int4VcEv-1588248758277)(media/image1.png)]{width=“2.8181813210848645in” height=“0.8350174978127735in”}

11.3.2 BorderLayout布局管理器

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-ur5TFAvi-1588248758285)(media/image2.png)]{width=“2.1172134733158354in” height=“1.7979505686789152in”}

BorderLayout将容器分成上面5個區域,

使用BorderLayout添加元件時,需要指定區域,否則預設為CENTER。

如果一個區域放入多個元件,後放的會覆寫先放的。

Frame = new Frame(“test”);

f.setLayout(new BorderLayout());

f.add(new Button(“南”), SOUTH);

f,pack() //設定視窗最佳大小

f.setVisible(true);

@使用Panel容器可以包含多個元件,作為一個整體放入一個區域。

11.3.3 GraidLayouy

網格布局,預設從左到右,從上到下依次添加到每個網格中。

構造器

GridLayout(int rows,int cols);

11.3.4 GridBagLayout

類似GridLayout,但更靈活複雜,需要使用GridBagConstraints對象。

11.3.5 CardLayout布局管理器

類似撲克牌 元件疊在一起。

11.3.6 絕對定位

設定布局管理器為null,添加元件時手動設定元件大小位置,然後在添加。

不推薦使用絕對定位,這可能導緻GUI失去跨平台特性。

11.3.7 BoxLayout布局管理器

Swing提供的BoxLayout,保留GridBagLayout的很多優點,卻沒那麼複雜。

構造器:

BoxLayout(Container target,int axis)

建立基于target容器的布局管理器,axis方向有X_AXIS ,Y_AXIS。

常常和Box容器結合使用。

Box是提供兩個方法建立Box對象,

createHorizontalBox()

createVerticalBox()

11.4 AWT基本元件

11.4.1 基本元件

Button 按鈕

Canvas 畫布

Checkbox 複選框

CheckboxGroup

Choice 下拉選擇

Frame 視窗

Label 标簽

List 清單框元件

Panel

Scrollbar 滑動條

Scrollpane

TextArea 多行文本

TextField 單行文本

11.4.2 對話框(Dialog)

Window類的子類。

對話框通常依賴于其他視窗,

對話框有非模式和模式兩種,在模式對話框被關閉前,它的依賴視窗無法獲得焦點。

構造器參數:

owner:依賴視窗

title: 标題

modal: 是否是模式的。

Dialog類子類FileDialog,表示檔案對話框,用于打開或儲存檔案。

構造參數:

parent

title

mode: 用于指定打開檔案LOAD或儲存檔案SAVE

11.5 事件處理

11.5.1 Java事件模型的流程

事件處理設計三類對象:

事件源: 事件發生的場所,通常是元件,如按鈕、視窗等。

事件 元件上發生的事情。

事件監聽器 監聽事件源發生的事件,并對事件進行響應處理。

當使用者單擊一個按鈕,這一動作就會觸發相應的事件,事件會觸發事件源上注冊的事件監聽器,事件監聽器調用相應的方法進行響應。

每個元件均可以針對特定事件指定一個或多個監聽對象,每個事件監聽器也可以監聽一個或多個事件源。

import java.awt.*;

import java.awt.event.*;

public class EventQs

{

private Frame f = new Frame(“測試事件”);

private Button ok = new Button(“确定”);

private TextField tf = new TextField(30);

public void init()

{

//注冊事件監聽器

ok.addActionListener(new OkListener());

f.add(tf);

f.add(ok,BorderLayout.SOUTH);

f.pack();

f.setVisible(true);

}

//定義事件監聽器

class OkListener implements ActionListener{

//響應

public void actionPerformed(ActionEvent e){

System.out.println(“使用者單擊了ok按鈕”);

tf.setText(“Hello,world”);

}

}

public static void main(String[] args){

new EventQs().init();

}

}

11.5.2 事件和事件監聽器

事件監聽器必須實作事件監聽接口。

AWT事件分為兩大類,低級事件和進階事件。

1.低級事件

指特定動作的事件,如進入、點選、拖放等滑鼠動作。

ComponentEvent: 元件事件,元件位置尺寸,可見性發生變化

ContainerEvent: 容器事件 容器添加,删除元件

WindowEvent:視窗事件,視窗狀态改變觸發

FocusEvent:焦點事件

KeyEvent:鍵盤事件

MouseEvent:滑鼠事件

PaintEvent:元件繪制事件。

2.進階事件(語義事件)

基于語義,可以不和特定的動作相關,而依賴于觸發此事件的類。

ActionEvent:動作事件,當按鈕,菜單被單擊,在TextField中按下Enter鍵。

AdjustmentEvent:調節事件,在滑動條滑動時觸發

ItemEvent:選項事件,使用者選擇、取消某項時觸發

TextEvent:文本事件,文本改變時觸發。

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-vsLKo9t5-1588248758287)(media/image3.png)]{width=“7.964753937007874in” height=“7.788319116360455in”}

11.5.3事件擴充卡

事件擴充卡是監聽器接口的空實作,事件擴充卡實作了監聽器接口,并為接口裡每個方法都實作了空實作。

當需要建立監聽器時,可以通過繼承事件擴充卡,這樣就隻需要重寫自己感興趣的方法。

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-E11OrMdT-1588248758291)(media/image4.png)]{width=“7.426573709536308in” height=“1.495022965879265in”}

11.5.4 使用内部類實作監聽器

11.5.5 使用外部類實作監聽器

比較少見,因為外部類不能自由通路GUI界面類的元件,程式設計不簡潔。

但如果某個事件監聽器确實需要被多個GUI界面共享,而且主要完成某種業務邏輯的實作,則可以考慮外部類實作事件監聽器類。

11.5.6 類本身作為事件監聽器類

比較簡潔但容易産生混亂。

11.5.7 匿名内部類實作監聽器

大部分事件監聽器隻用一次,沒有複用價值,是以使用匿名内部類實作會更合适。

import java.awt.*;

import java.awt.event.*;

import java.awt.event.WindowAdapter;

public class AnonymousEventHandler

{

private Frame f = new Frame(“test”);

private TextArea ta = new TextArea(6,40);

public void init()

{

//匿名内部類實作事件監聽器

f.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

System.out.println(“close window\n”);

System.exit(0);

}

});

f.add(ta);

f.pack();

f.setVisible(true);

}

public static void main(String[] args) {

new AnonymousEventHandler().init();

}

}

11.6 AWT菜單

建立菜單與建立元件完全類似。

11.6.1 菜單條、菜單和菜單項

菜單有幾個類組合而成:

MenuBar:菜單條,菜單的容器

Menu:菜單元件,菜單項的容器。它也是MenuItem子類,可以做菜單項

PopupMenu:上下文菜單元件(右鍵菜單元件)

MenuItem 菜單項元件

CheckboxMenuItem: 複選框菜單項元件

MenuShortcut 菜單快捷鍵

菜單分隔符:将功能相似的菜單分組

1、調用Menu對象的addSeparator()

2、使用添加new MenuItem("-")方式添加菜單分隔線。

11.6.2 右鍵菜單

11.7 在AWT中繪圖

11.7.1 畫圖的實作原理

在Component類裡提供了會繪圖相關的3個方法:

paint(Graphics g):繪制元件外觀

update(Graphics g) :調用paint方法,重新整理元件外觀

repaint() :調用update方法,重新整理元件外觀。

如果程式希望重新繪制元件,則調用該元件的repaint()方法。而paint()或update()方法通常被重寫。

11.7.2 使用Graphics類

Graphics可以在元件上繪圖。

drawXxxx

fillXxx

drawImage():繪制位圖

還提供了兩個set方法設定畫筆顔色和字型。

AWT提供了一個Canvas類作為繪圖的畫布,通過建立Canvas子類并重寫paint()方法來實作繪圖。

可以借助Timer類實作 每隔一段時間就調用元件的repaint()方法, 用來實作動畫效果。

Timer(int delay,ActionListener listener):每隔delay毫秒,就觸發ActionListener監聽器中的時間處理器。

11.8 處理位圖

11.8.1 Image抽象類和BufferedImage實作類

BufferedImage提供一個構造器建立對象:

BufferedImage(int width,int height,int ImageType);

還通過了一個getGraphics()方法傳回該對象的Graphics對象,進而允許通過該Graphics對象向Image中添加圖像。

11.8.2 使用ImageIO 輸入、輸出位圖

read write 靜态方法

11.9 剪切闆

AWT支援兩種剪切闆,本地和系統剪切闆(用于Java程式和第三方)

11.9.1 資料傳遞的類和接口

11.9.2 傳遞文本

11.9.3 使用系統剪切闆傳遞圖像

11.9.4 使用本地剪切闆傳遞對象引用

本地剪切闆可以儲存任何類型的Java對象。