黑马程序员--Java学习19--AWT组件及事件处理

本文介绍了Java AWT库中的组件和容器类,包括Button、Label等,以及窗口创建与布局管理。文章通过示例展示了如何创建Frame窗口、设置窗口属性,并利用事件监听机制实现窗口关闭功能。此外,还提到了菜单和菜单项的创建,以及如何为文本框添加保存功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

        通过图形用户界面(GUI),用户和程序之间可以方便的进行交互。Java的抽象窗口工具包(AWT)中包含了许多类来支持GUI设计。AWT由Java的java.awt包提供,该包中有许多用来设计GUI的组件类,如按钮、菜单、列表、文本框等组件类,同时还包含窗口、面板等容器类。在学习GUI编程时,必须很好地理解两个概念:容器类(Container)和组件类(Component)。Java.awt包中的一部分层次关系如图:

  • Button、Lable、Checkbox、TextComponent、TextArea、TextField类是Java.awt包中的类,并且是Java.awt包中的Component(组件)的子类。Java把Component类的子类或间接子类创建的对象称为一个组件。
  • Java把Container的子类或间接子类创建的对象称为一个容器。
  • 可以向容器内添加组件。Component类提供了一个public方法:add(),一个容器可以调用此方法想容器内添加组件。
  • 容器调用removeAll()方法可以移掉容器中的全部组件,调用remove(Component c)方法可以移掉容器中参数指定的组件。
  • 每当容器中添加新的组件或是移除组件时,应当调用validate()方法,以保证容器中的组件能正确显示出来。
  • 注意到容器本身也是一个组件,因此一个容器可以使用add方法添加另一个容器,实现容器的嵌套,被添加的容器称为该容器的内嵌容器。

一、Java窗口

       Frame类是Container类的间接子类,当需要一个窗口时,可使用Frame或其子类创建一个对象。窗口也是一个容器,可以向窗口添加组件。需要注意的是,窗口默认地被系统添加到显示屏上,因此,不可以将一个窗口添加到另一个容器中。

      Frame中的常用方法:

  1. Frame(): 该构造方法可以创建一个无标题的窗口,窗口默认布局为BorderLayout布局。
  2. Frame(String s) :该构造方法可以创建一个标题为s的窗口,窗口默认的是BorderLayout布局。
  3. public void setBounds(int a,itn b,int width,int height) :窗口调用该方法可以设置出现在屏幕上时的初始位置(a,b),窗口的宽是width,高是height。
  4. pubic void setSize(int width,itn height) :设置窗口的大小,窗口在屏幕出现的默认位置是(0,0)。
  5. public void setVisible(boolean b) :设置窗口可见还是不可见,默认是不可见的。
  6. public void setResizable(boolean b) :设置窗口是否可以调整大小,默认是可以调整的。

MenuBar:Java.awt包中的MenuBar类负责创建菜单条的,即MenuBar的一个实例就是一个菜单条。

Menu :Java.awt包中的Menu类是负责创建菜单的。即Menu的一个实例就是一个菜单。

MenuItem:Java.awt包的MenuItem类负责创建菜单项,即MenuItem的一个实例就是一个菜单 项。

创建图形化界面的步骤:

1、创建Frame窗口。
2、对窗口大小进行设置
      比如大小,位置,布局
3、定义组件
4、将组件通过窗体的add方法添加到窗体中
5、让窗体显示,通过setVisible(true);

/*
制作菜单
*/
import java.awt.*;
import java.awt.event.*;
class MyMenuDemo6 {
	private Menu m,m2;
	private MenuBar mb;
	private Frame f;
	private MenuItem m1;
	MyMenuDemo6() {
		init();
	}
	public void init() {
		f=new Frame("My Frame");
		f.setBounds(300,300,500,300);
		f.setLayout(new FlowLayout());

		m=new Menu("文件");
		m2=new Menu("新建");
		
		
		mb=new MenuBar();

		m1=new MenuItem("java");
		//m2=new MenuItem("MenuItem2");
		
		m2.add(m1);
		m.add(m2);
		mb.add(m);
		f.setMenuBar(mb);

		
		f.setVisible(true);
	}
	
	public static void main(String[] args) {
		
		MyMenuDemo6 m=new MyMenuDemo6();
	}
}

结果是:

但是当我点击关闭键时并没有反应,那么该怎么让窗口具备我们常见的关闭功能呢?下面我们来讲事件监听机制:

时间监听机制流程图:

事件监听机制的特点:
1、事件源
2、事件
3、监听器
4、事件处理

事件源:就是awt包或者swing包中的那些图形界面组件

事件:每一个事件源都有自己特有的对应事件和共性事件

监听器:可以出发某一个事件的动作(不止一个动作)都已经封装到了监听器中

以上三者:在java中都已经定义好了。直接获取其对象来用就可以了,我们要做的事情就是对产生的动作进行处理。

下面我们来让窗口具备关闭功能。

import java.awt.*;
import java.awt.event.*;
class FrameDemo3 {
	
	private Frame f;
	private Button b;
	FrameDemo3() {
		init();
	}
	public void init() {
		
		f=new Frame("My Frame");
		//设置窗口位置,大小
		f.setBounds(300,200,500,400);

		//设置布局
		f.setLayout(new FlowLayout());
		
		//设置按钮
		b=new Button("Button");
		f.add(b);
		
		myEvent();
		//设置窗口可见
		f.setVisible(true);
		
	}
	public void myEvent() {
		//点击关闭窗口
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		

	}
	public static void main(String[] args) {
		
		FrameDemo3 f=new FrameDemo3();
	}
}


现在我再点击关闭按钮时便可成功关闭窗口了!

例:需求:制作一个菜单,具备新建,打开,保存,退出功能,在文本框中输入内容时,点击 保存可以按照指定的目录保存。

import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyMenuDemo7 {
	private Menu m,m2;
	private MenuBar mb;
	private TextArea ta;
	private Frame f;
	private MenuItem m1,m3,m4,m5;
	private FileDialog openFile,saveFile;
	private File file;

	MyMenuDemo7() {
		init();
	}
	public void init() {
		f=new Frame("My Frame");
		ta=new TextArea();
		f.setBounds(300,300,500,300);
		//f.setLayout(new FlowLayout());
		f.add(ta);

		m=new Menu("文件");
		m2=new Menu("新建");
		m3=new MenuItem("打开");
		m4=new MenuItem("保存");
		m5=new MenuItem("退出");
		
		mb=new MenuBar();

		m1=new MenuItem("java");
		//m2=new MenuItem("MenuItem2");
		
		m2.add(m1);
		m.add(m2);
		m.add(m3);
		m.add(m4);
		m.add(m5);
		
		mb.add(m);
		f.setMenuBar(mb);

		openFile=new FileDialog(f,"我要打开",FileDialog.LOAD);
		saveFile=new FileDialog(f,"我要保存",FileDialog.SAVE);
		
		myEvent();
		f.setVisible(true);
	}
	public void myEvent() {
		f.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		m5.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				System.exit(0);
			}
		});
		m3.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				openFile.setVisible(true);
				String dirPath=openFile.getDirectory();
				String filename=openFile.getFile();
				if(dirPath==null || filename==null)
					return;
				ta.setText("");
				file=new File(dirPath,filename);

				try {
					BufferedReader bufr=new BufferedReader(new FileReader(file));
					
					String line=null;

					while((line=bufr.readLine())!=null) {
						ta.append(line+"\r\n");
					}
					bufr.close();
				}
				catch (IOException ex) {
					throw new RuntimeException("文件读取失败");
				}

			}
		});
		m4.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				if(file==null){
					saveFile.setVisible(true);
					String dirPath=saveFile.getDirectory();
					String filename=saveFile.getFile();
					if(dirPath==null || filename==null)
						return;
					file =new File(dirPath,filename);
				}
				try {
					BufferedWriter bufw=new BufferedWriter(new FileWriter(file));
					
					String text=ta.getText();
					bufw.write(text);
					bufw.close();
				}
				catch (IOException ex) {
					throw new RuntimeException("文件保存失败");
				}
			}
		});
	}
	public static void main(String[] args) {
		
		MyMenuDemo7 m=new MyMenuDemo7();
	}
}


结果:



但我点击关闭按钮时,会退出程序。

点击打开,弹出:

点击保存,弹出:




---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值