Java学习笔记(GUI)

知识点总结于毕向东Java基础视频教程25天版本,侵权请联系删除。

GUI

概述

  • 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。
  • 用图形的方式,来显示计算机操作的界面,这样更方便更直观。

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

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

Java为GUI提供的对象都存在java.Awt和javax.Swing两个包中。

  • java.Awt:Abstract Window ToolKit (抽象窗口工具包 ),需要调用本地系统方法实现功能。属重量级控件。
  • javax.Swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件。

继承关系

在这里插入图片描述

  • Container常用子类:Window Panel(面板, 不能单独存在)
  • Window常用子类:Frame Dialog

布局

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

  • 常见的布局管理器:
    • FlowLayout(流式布局管理器)
      • 从左到右的顺序排列。
      • Panel默认的布局管理器。
    • BorderLayout(边界布局管理器)
      • 东,南,西,北,中
      • Frame默认的布局管理器。
    • GridLayout(网格布局管理器)
      • 规则的矩阵
    • GridBagLayout(网格包布局管理器)
      • 非规则的矩阵
    • CardLayout(卡片布局管理器)
      • 选项卡

建立一个简单的窗体

import java.awt.*;

class Demo
{
	public static void main(String[] args){
		Frame frame=new Frame("this is my first frame");//设置了标题

		frame.setVisible(true);//设置窗体为显示状态
		frame.setSize(300,200);//设置窗体大小
		frame.setLocation(200,200);//设置窗体在窗口中出现的位置
		frame.setLayout(new FlowLayout());//设置窗体的布局方式,默认为BorderLayout

		frame.add(new Button("click"));//添加按钮控件
	}
}

事件监听机制

Java事件监听机制在Java图形界面编程处常用。我们会对界面做一些操作,比如输入框输入数据,点击登录按钮等等。这些操作被称为事件,当采取这些操作之后,程序会采取一定的措施响应。

事件监听机制组成:

  1. 事件源(组件)
    就是awt包或者swing包中的那些图形界面组件。
  2. 事件(Event)
    每一个事件源都有自己特有的对应事件和共性事件。
  3. 监听器(Listener)
    将可以触发某一个事件的动作(不只一个动作)都已经封装到了监听器中。
  4. 事件处理(引发事件后处理方式)
    对产生的动作进行相应的处理。

前三者,在java中都已经定义好了。直接获取其对象来用就可以了。

窗体事件(WindowEvent)

WindowListener是java中的接口。
主要作用:用于接收窗口事件的侦听器接口。旨在处理窗口事件的类要么实现此接口(及其包含的所有方法),要么扩展抽象类 WindowAdapter(仅重写所需的方法)。然后使用窗口的 addWindowListener 方法将从该类所创建的侦听器对象向该 Window 注册。当通过打开、关闭、激活或停用、图标化或取消图标化而改变了窗口状态时,将调用该侦听器对象中的相关方法,并将 WindowEvent 传递给该方法。

由于WindowListener是接口,所以我们需要找到实现它的子类WindowAdapter,但是该类属于抽象类,因为它的方法都是空方法,没有具体的内容,创建该类对象没有意义。这是为了我们不需要再通过实现WindowListener接口,再重新实现接口中的所有方法

所以可以用过两种事件处理方式:
1.只需要自定义一个类继承WindowAdapter再复写自己需要的处理窗体事件的方法。
2.或者直接定义WindowAdapter匿名内部类复写方法。

WindowAdapter方法:
void windowActivated(WindowEvent e):激活窗口时调用,即当窗口在最前面。  
void windowClosed(WindowEvent e):当窗口关闭时调用。  
void windowClosing(WindowEvent e):当窗口处于关闭状态时调用。  
void windowDeactivated(WindowEvent e):当窗口被禁用时调用。  
void windowDeiconified(WindowEvent e):当窗口被去图标化时调用。  
void windowGainedFocus(WindowEvent e):当窗口设置为聚焦窗口时调用,这意味着窗口或其子组件之一将接收
键盘事件。  
void windowIconified(WindowEvent e):当窗口被图标化时调用。  
void windowLostFocus(WindowEvent e):当窗口不再是聚焦窗口时调用,这意味着键盘事件将不再传递到窗口或
其任何子组件。  
void windowOpened(WindowEvent e):当窗口打开时调用。  
void windowStateChanged(WindowEvent e):当窗口状态改变时调用。  
import java.awt.*;
import java.awt.event.*;
class Demo
{
	public static void main(String[] args){
		Frame frame=new Frame("this is my first frame");

		frame.setVisible(true);
		
		frame.setSize(300,200);
		frame.setLocation(200,200);
		frame.setLayout(new FlowLayout());

		Button button = new Button("click");
		frame.add(button);

		//添加窗体监听器
		frame.addWindowListener(new WindowAdapter()
		{
			public void windowOpened(WindowEvent e){
				System.out.println("window opened");
			}
			public void windowActivated(WindowEvent e){
				System.out.println("window activated");
			}

			public void windowClosing(WindowEvent e){
				System.out.println("window closing");
				System.exit(0);//status为0时为正常退出程序,也就是结束当前正在运行中的java虚拟机。
			}		
		});
	}
}

Action事件(ActionEvent)

actionlistener是一个接口,ActionEvent通常在点击一个按钮或双击某个列表项或选中某个菜单时发生。

与WindowListener不同的是,ActionListener没有相应的适配器(例如WindowAdapter),这是因为ActionListener中的方法只有一个,使用者不需要像实现WindowListener那样复写多余的方法。

void actionPerformed(ActionEvent e):发生动作时调用。  
import java.awt.*;
import java.awt.event.*;
class Demo
{
	public static void main(String[] args){
		Frame frame=new Frame("this is my first frame");
		frame.setVisible(true);
		frame.setSize(300,200);
		frame.setLocation(200,200);
		frame.setLayout(new FlowLayout());
	
		Button button = new Button("click");
		button.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e){
				System.out.println("button closing");
				System.exit(0);
			}
		});
		frame.add(button);
	}
}

鼠标事件(MouseEvent)

指组件中发生鼠标操作的事件。
MouseAdapter用于接收鼠标事件的抽象适配器类(方法超过2个就有适配器)。 这个类中的方法是空的, 因为此类作为创建侦听器对象的方便而存在(与窗体事件同理,避免因为实现父类接口从而需要复写多种方法)。

MouseAdapter构造方法:
	MouseAdapter() 
	
方法摘要:
	void mouseClicked(MouseEvent e):在组件上单击(按下并释放)鼠标按钮时调用。  
	void mouseDragged(MouseEvent e):在组件上按下鼠标按钮然后拖动时调用。  
	void mouseEntered(MouseEvent e):当鼠标进入组件时调用。  
	void mouseExited(MouseEvent e):当鼠标退出组件时调用。  
	void mouseMoved(MouseEvent e):当鼠标光标移动到组件上但没有按钮被按下时调用。  
	void mousePressed(MouseEvent e):在组件上按下鼠标按钮时调用。  
	void mouseReleased(MouseEvent e):在组件上释放鼠标按钮时调用。  
	void mouseWheelMoved(MouseWheelEvent e):当鼠标滚轮旋转时调用。  
import java.awt.*;
import java.awt.event.*;
class Demo
{
	public static void main(String[] args){
		Frame frame=new Frame("this is my first frame");

		frame.setVisible(true);
		
		frame.setSize(300,200);
		frame.setLocation(200,200);
		frame.setLayout(new FlowLayout());
	
		Button button = new Button("button");
		button.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e){
				System.out.println("action"); //action事件会在点击事件发生之后继续执行
			}
		});
		frame.add(button);

		button.addMouseListener(new MouseAdapter()
		{

			public void mouseEntered(MouseEvent e){
				//鼠标触碰到组件
				System.out.println("mouse entered");
			}
			public void mouseExited(MouseEvent e){
				//鼠标离开组件
				System.out.println("mouse exited");
			}
			public void mouseClicked(MouseEvent e){
				//MouseEvent类中的方法:获取与此事件关联的鼠标点击次数
				if(e.getClickCount()==2)
					System.out.println("mouse doubleclicked");
			}
		});
	}
}

键盘事件(KeyEvent)

组件中发生击键的事件。当按下,释放或键入键时,此低级别事件由组件对象(例如文本字段)生成。 该事件传递给每个KeyListener或KeyAdapter对象,该对象使用组件的addKeyListener方法注册接收此类事件。当事件发生时,每个这样的侦听器对象获得这个KeyEvent 。
KeyAdapter对象实现KeyListener接口(适配器),因为KeyListener中有三个方法。

 KeyAdapte构造方法:
 	KeyAdapter() 

方法摘要:
	void keyPressed(KeyEvent e):按下键时调用。  
	void keyReleased(KeyEvent e):当键已被释放时调用。  
	void keyTyped(KeyEvent e):键入键时调用。  
import java.awt.*;
import java.awt.event.*;
class Demo
{
	public static void main(String[] args){
		Frame frame=new Frame("this is my first frame");

		frame.setVisible(true);
		
		frame.setSize(300,200);
		frame.setLocation(200,200);
		frame.setLayout(new FlowLayout());
	
		Button button = new Button("button");

		frame.add(button);

		button.addKeyListener(new KeyAdapter()
		{
			public void keyPressed(KeyEvent e){
				//返回与此事件中的键相关联的字符,如果按SHIFT等多个字母组成的键就会失败
				System.out.println(e.getKeyChar());
				//通过键盘上按下键的键值获取对应的键名,包括SHIFT等功能键
				System.out.println(e.getKeyText(e.getKeyCode()));
				//调用KeyEvent类中的静态常量(代表键盘上的键)和方法判断是否相继按下了CTRL键和ENTER键
				if(e.getKeyCode()==KeyEvent.VK_ENTER&&e.isControlDown())
					System.out.println("CTRL+ENTER run");
			}
		});

		TextField tf=new TextField(20);
		frame.add(tf);
		
		tf.addKeyListener(new KeyAdapter()
		{
			public void keyPressed(KeyEvent e){
				int code=e.getKeyCode();
				//只能输入0-9的数字
				if(!(code==KeyEvent.VK_0 && code==KeyEvent.VK_9)){
					System.out.println("输入非法");
					//通过KeyEvent中父类InputEvent的方法consume消耗掉此事件,即文本框中不会存在此次事件中键入的非法值
					e.consume();
				}
			}
		});
	}
}

事件监听机制

  1. 确定事件源(容器或组件);
  2. 通过事件源对象的addXXXListener()方法将侦听器注册到该 事件源上;
  3. 该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象;
  4. 一般用匿名内部类来表示;
  5. 在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收;
  6. 事件触发后会把事件打包成对象传递给该变量。(其中包括事件源对象,通过getSource()或者getComponent()获取)

对话框(Dialog)

Dialog类和Frame类都是window的子类。对话框必须依赖于某个窗口或组件,当它所依赖的窗口或组件消失时,对话框也消失;当它所依赖的窗口或组件可见时,对话框会自动恢复。

主要用法:
	1.Dialog(Frame f,String s):构造一个具有标题s的初始不可见的对话框,f是对话框所依赖的窗口。
	2.Dialog(Frame f,String s,boolean b):
		构造一个具有标题s的初始不可见的对话框,f是对话框所依赖的窗口,b决定对话框是有模式或无模式。
		//有模式代表对话框出现无法选中依赖窗口,无模式可以选中对话框依赖窗口。
	3.getTitle():获取对话框的标题。
	4.setTitle():设置对话框的标题。
	5.setModal(boolean b):设置对话框的模式。
	6.setSize():设置对话框的大小。
	7.setVisible(boolean b):显示或隐藏对话框。

FileDialog

FileDialog 类显示出一个对话框窗口,用户可以从中选择文件。
因为它是一个模式对话框,当应用调用它的 show 方法来显示对话框时,它会阻塞应用的其余部分直到用户选择了一个文件。

构造方法:
	FileDialog(Dialog parent):创建一个加载文件的文件对话框。  
	FileDialog(Dialog parent, String title):创建一个文件对话框窗口,其中包含用于加载文件的指定标题。  
	FileDialog(Dialog parent, String title, int mode) 创建一个带有指定标题的文件对话窗口,用于加载或保存文件。  
	FileDialog(Frame parent):创建一个加载文件的文件对话框。  
	FileDialog(Frame parent, String title):创建一个文件对话框窗口,其中包含用于加载文件的指定标题。  
	FileDialog(Frame parent, String title, int mode):创建一个带有指定标题的文件对话窗口,用于加载或保存文件。  

静态常量(int mode):
	LOAD:该常量值表示文件对话窗口的目的是找到要从中读取的文件。 
	SAVE:该常量值表示文件对话窗口的目的是找到要写入的文件。 

菜单

窗口菜单是由菜单条(MenmBar)、 菜单(Memu)、菜单项(Menltem)和复选菜单项CeckoMonultem等组成的。菜单放在菜单条里,菜单项放在菜单里。

  1. MenuBar,Menu,MenuItem
  2. 先创建菜单条,再创建菜单,每一个菜单中建立菜单项。
  3. 也可以菜单添加到菜单中,作为子菜单。
  4. 通过setMenuBar()方法,将菜单添加到Frame 中。

菜单继承体系:
在这里插入图片描述


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


class Demo 
{

	private Frame f;
	private MenuBar mb;
	private Menu m,subMenu;
	private MenuItem closeItem,subItem;

	Demo()
	{
		init();
	}
	public void init()
	{
		f = new Frame("my window");
		f.setBounds(300,100,500,600);
		f.setLayout(new FlowLayout());

		mb = new MenuBar();
		m = new Menu("文件");
		subMenu = new Menu("子菜单");
		subItem = new MenuItem("子条目");
		closeItem = new MenuItem("退出");
		
		subMenu.add(subItem);
		m.add(subMenu);
		m.add(closeItem);
		mb.add(m);

		f.setMenuBar(mb);

		myEvent();

		f.setVisible(true);
	}
	private void myEvent()
	{

		closeItem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				System.exit(0);
			}
		});
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);	
			}
		});
	}
	
	public static void main(String[] args) 
	{
		new Demo();
	}
}

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值