《疯狂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 kongyeeku@163.com
 * @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();
		
	}
}


关于绘图、剪贴板、拖放暂且略过。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值