1. 程式人生 > >《瘋狂Java講義(第4版)》-----第11章【AWT程式設計】(AWT常用元件、事件處理)

《瘋狂Java講義(第4版)》-----第11章【AWT程式設計】(AWT常用元件、事件處理)

AWT常用元件

雖說是常用元件,如果不經常使用,還是比較陌生的!!!暫且根據書本列出來一些,先結合書上例項認識之,待之後結合實際案例選擇用之、研究之(參看官方API)!

Button Canvas(用於繪圖的畫布) Checkbox CheckboxGroup(用於將多個Checkbox組合在一起) Choice(下拉選擇框) Frame Label List Panel Scrollbar(滾動條) Scrollpane(帶水平和垂直滾動條的容器) TextArea(多行文字域) TextField(單行文字框) Dialog(對話方塊)

【示例程式碼見書408~409頁】

Dialog

官方文件上Dialog有很多構造器,下面列出其中一個: 在這裡插入圖片描述

注意其中的modal引數!!

【示例程式碼見書409~410頁】 注意觀察演示的效果!!程式碼把兩個按鈕綁定了事件,點選按鈕就彈出對於的Dialog,當modal設定為true的時候,彈出Dialog後,原來的那個Frame視窗就不能操作了;當modal設定為false的時候,彈出Dialog後,原來的那個Frame視窗是可以操作的,可以點選另外一個按鈕!

FileDialog

Dialog的子類,是開啟或儲存檔案的對話方塊,不能像Dialog對話方塊一樣指定是模式對話方塊還是非模式對話方塊,依賴執行的平臺。下面是FileDialog的一個構造器。注意mode引數!! 在這裡插入圖片描述 【示例程式碼見書410~411頁】

執行程式後,可以點選開啟檔案或儲存檔案,彈出對應的對話方塊。

事件處理

  • 事件源:各個元件
  • 事件
  • 事件監聽器:監聽事件源發生的事件,對事件做出響應處理。

【以Button繫結事件監聽器為例】

下面以點選按鈕為例,進行事件處理的入門學習。按鈕就是事件源,使用者點選按鈕就是事件,點選按鈕後,系統自動生成事件物件(java.uti.EventObject子類的例項),該事件物件會觸發繫結到按鈕上的事件監聽器,響應並處理事件。

Button類提供了下面這個方法,注意傳入的引數是ActionListener介面的實現類。

在這裡插入圖片描述 而ActionListener介面只有一個方法且是抽象方法: 在這裡插入圖片描述


import java.awt.Frame;
import java.awt.Button;
import java.awt.TextField;
import java.awt.BorderLayout;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Hello{
	
	private Frame f = new Frame("事件入門");
	private Button b = new Button("點我");
	private TextField tf = new TextField(10);

	public void init(){
		//繫結事件監聽器:傳入ActionListener介面的實現類例項
		//匿名內部類實現ActionListener介面
		b.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				System.out.println("有人點選了按鈕");
				tf.setText("您點了我");
			}
		});
		f.setBounds(100, 200, 300, 20);
		
		f.add(tf);
		f.add(b, BorderLayout.EAST);
		f.pack();
		f.setVisible(true);
		
	}

	public static void main(String[] args) throws Exception{
				
		new Hello().init();
		
	}
}

點選按鈕後如下: 在這裡插入圖片描述

事件和事件監聽器

414頁列出了常見的AWT事件,以及相應的監聽器介面。通過這個表,可以大致清楚常用元件發生的常見事件、去繫結哪個監聽器。一個事件源可能發生多種事件,故可繫結多個監聽器監聽不同的事件,反之,一個監聽器也可以監聽多個事件源。具體例子見415頁程式程式碼。

416頁程式演示了視窗監聽器的使用如下:


import java.awt.*;
import java.awt.event.*;
/**
 * Description:
 * 網站: <a href="http://www.crazyit.org">瘋狂Java聯盟</a><br>
 * Copyright (C), 2001-2018, Yeeku.H.Lee<br>
 * This program is protected by copyright laws.<br>
 * Program Name:<br>
 * Date:<br>
 * @author Yeeku.H.Lee [email protected]
 * @version 1.0
 */
public class WindowListenerTest
{
	private Frame f = new Frame("測試");
	private TextArea ta = new TextArea(6 , 40);
	public void init()
	{
		// 為視窗新增視窗事件監聽器
		f.addWindowListener(new MyListener());
		f.add(ta);
		f.pack();
		f.setVisible(true);
	}
	// 實現一個視窗監聽器類
	class MyListener implements WindowListener
	{
		public void windowActivated(WindowEvent e)
		{
			ta.append("視窗被啟用!\n");
		}
		public void windowClosed(WindowEvent e)
		{
			ta.append("視窗被成功關閉!\n");
		}
		public void windowClosing(WindowEvent e)
		{
			ta.append("使用者關閉視窗!\n");
			System.exit(0);
		}
		public void windowDeactivated(WindowEvent e)
		{
			ta.append("視窗失去焦點!\n");
		}
		public void windowDeiconified(WindowEvent e)
		{
			ta.append("視窗被恢復!\n");
		}
		public void windowIconified(WindowEvent e)
		{
			ta.append("視窗被最小化!\n");
		}
		public void windowOpened(WindowEvent e)
		{
			ta.append("視窗初次被開啟!\n");
		}
	}
	public static void main(String[] args)
	{
		new WindowListenerTest().init();
	}
}

事件介面卡

事件介面卡實現了事件監聽器介面的所有方法(但每個方法體都是空的)。這樣當我們要給事件源繫結事件的時候,只需寫一個相應的事件介面卡的子類並傳入這個子類的例項就OK了。關鍵的一點是,只需要在子類中寫我們需要的方法,我們不需要的方法不用寫。

417頁表格列出了各個監聽器介面對應的介面卡。

例項:視窗介面卡實現關閉視窗功能】 還是以視窗監聽器WindowListener為例,要繫結視窗監聽器,就要寫一個該介面的實現類,實現該接口裡面的6個方法,幸好WindowAdapter已經實現了WindowListener介面,我們只需要寫一個類繼承WindowAdapter即可。下面例項僅需要關閉視窗的功能,所以我們在寫子類的時候只需要寫一個關閉視窗這個方法覆蓋下即可。

import java.awt.*;
import java.awt.event.*;

public class Hello
{
	private Frame f = new Frame("測試");
	private TextArea ta = new TextArea(6 , 40);
	public void init()
	{
		// 為視窗新增視窗事件監聽器
		f.addWindowListener(new MyListener());
		f.add(ta);
		f.pack();
		f.setVisible(true);
	}
	// 實現一個視窗監聽器類
	class MyListener extends WindowAdapter
	{
		
		public void windowClosing(WindowEvent e){
			ta.append("使用者關閉視窗!\n");
			System.exit(0);
		}
	}
	public static void main(String[] args){
		new Hello().init();
	}
}

繫結事件監聽器的方式總結

  • 外部類
  • 內部類
  • 匿名內部類
  • 類本身(類本身實現相應的監聽器介面或繼承相應的介面卡,由於父類只能有一個,如果繼承了介面卡就不能繼承其他類了)
  • Lambda表示式(傳入的式事件監聽器的實現類例項,且該事件監聽器必須是函式式介面)

【以點選按鈕的事件處理入門程式為例介紹展示各種繫結監聽器方式】 (1)匿名內部類

import java.awt.Frame;
import java.awt.Button;
import java.awt.TextField;
import java.awt.BorderLayout;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Hello{
	
	private Frame f = new Frame("事件入門");
	private Button b = new Button("點我");
	private TextField tf = new TextField(10);

	public void init(){
		//繫結事件監聽器:傳入ActionListener介面的實現類例項
		//匿名內部類實現ActionListener介面
		b.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				System.out.println("有人點選了按鈕");
				tf.setText("您點了我");
			}
		});
		f.setBounds(100, 200, 300, 20);
		
		f.add(tf);
		f.add(b, BorderLayout.EAST);
		f.pack();
		f.setVisible(true);
		
	}

	public static void main(String[] args) throws Exception{
				
		new Hello().init();
		
	}
}

在這裡插入圖片描述

(2)Lambda表示式

import java.awt.Frame;
import java.awt.Button;
import java.awt.TextField;
import java.awt.BorderLayout;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Hello{
	
	private Frame f = new Frame("事件入門");
	private Button b = new Button("點我");
	private TextField tf = new TextField(10);

	public void init(){
		//繫結事件監聽器:傳入ActionListener介面的實現類例項
		//Lambda表示式實現ActionListener介面
		b.addActionListener(ActionEvent->{
			System.out.println("有人點選了按鈕");
			tf.setText("您點了我");
			
		});
		f.setBounds(100, 200, 300, 20);
		
		f.add(tf);
		f.add(b, BorderLayout.EAST);
		f.pack();
		f.setVisible(true);
		
	}

	public static void main(String[] args) throws Exception{
				
		new Hello().init();
		
	}
}

(3)外部類

import java.awt.Frame;
import java.awt.Button;
import java.awt.TextField;
import java.awt.BorderLayout;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Hello{
	
	private Frame f = new Frame("事件入門");
	private Button b = new Button("點我");
	private TextField tf = new TextField(10);

	public void init(){
		//繫結事件監聽器:傳入ActionListener介面的實現類例項
		//外部類實現ActionListener介面
		b.addActionListener(new MyListener());
		f.setBounds(100, 200, 300, 20);
		
		f.add(tf);
		f.add(b, BorderLayout.EAST);
		f.pack();
		f.setVisible(true);
		
	}

	public static void main(String[] args) throws Exception{
				
		new Hello().init();
		
	}
}


class MyListener implements ActionListener{

	public void actionPerformed(ActionEvent e){
		System.out.println("有人點選了按鈕");
	}
}

(4)內部類

import java.awt.Frame;
import java.awt.Button;
import java.awt.TextField;
import java.awt.BorderLayout;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Hello{
	
	private Frame f = new Frame("事件入門");
	private Button b = new Button("點我");
	private TextField tf = new TextField(10);


	class MyListener implements ActionListener{

		public void actionPerformed(ActionEvent e){
			System.out.println("有人點選了按鈕");
			tf.setText("您點了我");
		}
	}	
	
	public void init(){
		//繫結事件監聽器:傳入ActionListener介面的實現類例項
		//外部類實現ActionListener介面
		b.addActionListener(new MyListener());
		f.setBounds(100, 200, 300, 20);
		
		f.add(tf);
		f.add(b, BorderLayout.EAST);
		f.pack();
		f.setVisible(true);
		
	}

	public static void main(String[] args) throws Exception{
				
		new Hello().init();
		
	}
}


(5)類本身

import java.awt.Frame;
import java.awt.Button;
import java.awt.TextField;
import java.awt.BorderLayout;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Hello implements ActionListener{
	
	private Frame f = new Frame("事件入門");
	private Button b = new Button("點我");
	private TextField tf = new TextField(10);


	public void actionPerformed(ActionEvent e){
		System.out.println("有人點選了按鈕");
		tf.setText("您點了我");
	}
		
	
	public void init(){
		//繫結事件監聽器:傳入ActionListener介面的實現類例項
		//外部類實現ActionListener介面
		b.addActionListener(this);
		f.setBounds(100, 200, 300, 20);
		
		f.add(tf);
		f.add(b, BorderLayout.EAST);
		f.pack();
		f.setVisible(true);
		
	}

	public static void main(String[] args) throws Exception{
				
		new Hello().init();
		
	}
}