天天看点

GUI__【GUI概述】【布局】【Frame】【事件监听机制】【窗体事件】【按钮】【鼠标事件】【键盘事件】【Dialog对话框】【菜单】GUI概述:布局事件监听机制

GUI概述:

GUI

Graphical User Interface(图形用户接口)。

用图形的方式,来显示计算机操作的界面,这样更方便更直观。

CLI

Command line User Interface (命令行用户接口)

就是常见的Dos命令行操作。 需要记忆一些常用的命令,操作不直观。

Awt与 Swing

java.Awt:Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件。(即依赖于系统资源,跨平台性较差)

javax.Swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件。(跨平台性较强)

Swing组件的继承体系:

GUI__【GUI概述】【布局】【Frame】【事件监听机制】【窗体事件】【按钮】【鼠标事件】【键盘事件】【Dialog对话框】【菜单】GUI概述:布局事件监听机制

该体系要记清楚,便于开发时查阅API文档

-----------------------------------------------------------------------------------------------------------

布局

容器中的组件的排放方式,就是布局。

常见的布局管理器:

FlowLayout(流式布局管理器)从左到右的顺序排列。

Panel 默认的布局管理器。

BorderLayout(边界布局管理器)东,南,西,北,中

Frame 默认的布局管理器。

GridLayout(网格布局管理器)规则的矩阵

CardLayout(卡片布局管理器)选项卡

GridBagLayout(网格包布局管理器)非规则的矩阵

其它高级布局:坐标式布局

Frame 是带有标题和边框的顶层窗口。

创建图形化界面的基本步骤:

1,创建Frame窗体

2,对窗体进行基本设置:大小、位置、布局等

3,定义组件:按钮、标签、复选框、文本组件等

4,将组建通过窗体的add方法添加到窗体中

5,让窗显示,通过setVisible(True)方法

事件监听机制

事件监听机制的特点:

1,事件源(组件):Awt或Swing包中图形界面组件

2,事件(Event):每一个女事件源都有自己特有的对应事件和共性事件

3,监听器(Listener):封装了可以触发某一个事件的动作(不止一个),监听器往往还具备适配器

4,事件处理(引发事件后处理方式)

123在java中都已经定义好了,我们要做的事情是:对产生的事件进行处理

GUI__【GUI概述】【布局】【Frame】【事件监听机制】【窗体事件】【按钮】【鼠标事件】【键盘事件】【Dialog对话框】【菜单】GUI概述:布局事件监听机制

------------------------------------------------------------------------------------

窗体事件

监听器隶属于awt.event包,

class MyListener implements WindowListener

{七个方法}

直接实现的话需要覆盖该接口的7个抽象方法,而需要用的方法可能只有一个

WindowListener 的子类WindowAdapter(适配器)实现了该接口,并覆盖了所有方法,我们只需继承WindowAdapter类并覆盖我们需要的方法即可

创建一个带监听器的窗口:

import java.awt.*;
import java.awt.event.*;//子包
class AwtDemo 
{
	public static void main(String[] args) 
	{	
		Frame f = new Frame("my Awt");	//构造一个新的、最初不可见的、具有指定标题的 Frame 对象。
		f.setSize(618,400);		//设置宽高
		f.setLocation(300,200);	//设置在屏幕上坐标位置
		f.setLayout(new FlowLayout());	//设置流式布局
		Button b = new Button("这是一个按钮");//创建按钮,默认为边界布局
		f.add(b);				//往容器里添加按钮

		f.addWindowListener(new WindowAdapter()
		{		//使用适配器,添加监听器
			public void windowClosing(WindowEvent e){//覆盖父类方法,窗口正处在关闭过程中时调用。
				System.out.println("关闭窗口");//打印
				System.exit(0);		//关闭程序,这个动作最为常见
			}
			public void windowActivated(WindowEvent e){//窗口处于最前端
				System.out.println("激活窗口");
			}
			public void windowOpened(WindowEvent e){//打开窗口时触发
				System.out.println("已打开窗口");
			}
		});	
		f.setVisible(true);
	}
}
           

WindowEvent:即窗体事件,指示窗口状态改变的低级别事件。当打开、关闭、激活、停用、图标化

或取消图标化 Window 对象时,或者焦点转移到 Window 内或移出 Window 时,由 Window 对象生成此低级别事件

按钮监听

需求:

让按钮具备退出程序的功能;按钮就是事件源,应该选择哪个监听器呢?

通过关闭窗体示例了解到:要想知道哪个组件具备什么监听器,需要查看该组件对象的功能

查阅APT文档,button按钮支持一个特有监听器addActionListener(ActionListener);

ActionListener:事件监听器接口

该接口只有一个方法:void actionPerformed(ActionEvent e) 发生操作时调用 

适配器的作用是为了便于调用监听器的方法,一般方法超过三个的监听器都具备适配器,ActionListener只有一个方法就没必要使用适配器了,直接继承即可

将窗体事件的代码优化并演示按钮:

import java.awt.*;
import java.awt.event.*;
class  FrameDemo
{
	private Frame f;//定义组件的引用
	private Button but;
	FrameDemo(){				//构造方法
		init();	//调用方法
	}
	public void init()			//初始化窗体
	{
		f = new Frame("my Frame");
		f.setBounds(300,200,600,400);//移动组件并调整其大小。600*400
		f.setLayout(new FlowLayout());//设置布局
		but = new Button("mu Button");//设置按钮
		f.add(but);					//将组件添加到窗体

		myEvent();//调用方法
		f.setVisible(true);			//显示窗体
	}
	private void myEvent()		//封装事件
	{
		f.addWindowListener(new WindowAdapter(){//继承内部类,窗体监听器,窗体退出功能
			public void windowClosing(WindowEvent e){//窗体事件
				System.out.println("窗体退出");
				System.exit(0);
			}
		});
		but.addActionListener(new ActionListener(){//接口内部类,事件监听器,按钮退出功能
			public void actionPerformed(ActionEvent e){//活动事件(按钮)
				System.out.println("按钮退出");
				System.exit(0);
			}
		});
	}
	public static void main(String[] args){
		FrameDemo f = new FrameDemo();
	}
}
           

鼠标事件

查看API,Button的父类Component方法void addMouseListener(MouseListener l) 添加鼠标侦听器,使用MouseListener接口及其适配器,进行鼠标事件的侦听

示例:

private void myEvent()		//封装事件,都是以内部类的形式
	{
		f.addWindowListener(new WindowAdapter(){//窗体监听适配器,窗体退出功能
			public void windowClosing(WindowEvent e){//窗体事件
				System.out.println("窗体退出");
				System.exit(0);
			}
		});
		but.addActionListener(new ActionListener(){//接口型内部类,按钮活动监听
			private int signal = 1;	//该监听器的按钮使用鼠标和键盘都可以操作
			public void actionPerformed(ActionEvent e){
				System.out.println("ActionListener:"+signal++);
			}
		});
		but.addMouseListener(new MouseAdapter(){//鼠标监听适配器,按钮监听,
			private int count = 1;
			private int flag = 1;
			public void mouseEntered(MouseEvent e){//鼠标进入事件
				System.out.println("鼠标进入按钮:"+count++);
			}
			public void mouseClicked(MouseEvent e){//点击鼠标事件
				if(e.getClickCount()==2)	//鼠标动作,双击时触发
					System.out.println("双击鼠标:"+flag++);
			}
		});
	}
           

ActionListener事件监听可以对鼠标和键盘事件都做出反馈;MouseListener 鼠标监听只监听鼠标事件

如果一个按钮上同时具备Action和Mouse两个监听器,一般来说会先执行鼠标监听器,因为它的动作更具体

但是偶尔也会有先执行Action的情况;运行结果如下左图:

鼠标监听可以根据鼠标事件的动作来决定,例如可以设置每次操作点击鼠标次数来决定反应,运行结果如下右图:

GUI__【GUI概述】【布局】【Frame】【事件监听机制】【窗体事件】【按钮】【鼠标事件】【键盘事件】【Dialog对话框】【菜单】GUI概述:布局事件监听机制
GUI__【GUI概述】【布局】【Frame】【事件监听机制】【窗体事件】【按钮】【鼠标事件】【键盘事件】【Dialog对话框】【菜单】GUI概述:布局事件监听机制

键盘事件:

使用Component中方法void addKeyListener(KeyListener l)添加针对键盘事件的监听器,使用KeyListener接口及其适配器,使用KeyEvent控制规则

给按钮添加一个键盘监听

but.addKeyListener(new KeyAdapter(){//给but添加一个键盘监听
			public void keyPressed(KeyEvent e){
				if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)//规则:组合键Ctrl+Enter时触发
					sop("Ctrl+Enter");
//					System.exit(0);
//				sop(KeyEvent.getKeyText(e.getKeyCode())+" : "+e.getKeyCode());//输出键盘上对应键的 名称+值
				}
			});
           

文本组件中的键盘监听

//构造初始化:
TextField tf = new TextField(10);//创建文本框,长度为10
f.add(tf);//添加文本框
//在myEvent()中添加监听器:
		tf.addKeyListener(new KeyAdapter(){//给tf文本框添加键盘监听
			public void keyPressed(KeyEvent e){
				int code = e.getKeyCode();
				if(!(code>=KeyEvent.VK_0 && code<=KeyEvent.VK_9)){//
					sop("非法数值!");
					e.consume();//一旦满足条件,不使用默认的执行
				}
			}
		});
           

Dialog对话框:

在触发某一事件时弹出对话框提醒用户

创建时需要关联窗体,方法与窗体类似可以添加按钮,设置标签Label,通过setVisible(boolean b);来控制弹出和消失

菜单

继承体系如图:

GUI__【GUI概述】【布局】【Frame】【事件监听机制】【窗体事件】【按钮】【鼠标事件】【键盘事件】【Dialog对话框】【菜单】GUI概述:布局事件监听机制

MenuBar,Menu,MenuItem

先创建菜单条,再创建菜单,每一个菜单中建立菜单项。

也可以菜单添加到菜单中,作为子菜单。

通过setMenuBar()方法,将菜单添加到Frame中。

详细用法参见API及后续练习

继续阅读