黑马程序员-javaGUI编程总结

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


一、GUI概述

1、GUI与CLI

GUI:Graphical User Interface(图形用户界面)

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

CLI:Command line User Interface(命令行用户界面)

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


2、AWT与Swing

java为GUI提供的对象都存在java.awt和javax.swing两个包中。

java.awt:Abstract Window Toolkit(抽象窗口工具包),需要调用本地系统方法实现功能,属于重量级控件。

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


延伸阅读:Java GUI:图形用户界面三剑客相比拼


3、组件关系图











二、GUI布局

布局管理器:

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

常见的布局管理器:

1、FlowLayout(流式布局管理器):从左到右的顺序排列,Panel默认的布局管理器。

2、BorderLayout(边界布局管理器):界面分为东、南、西、北、中,Frame默认的布局管理器。

3、GridLayout(网格布局管理器):规则的矩阵。

4、CardLayout(卡片布局管理器):选项卡。

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


延伸阅读:java GUI设计和布局


我们先通过一个创建窗体的小例子,来简单了解下GUI编程

三、GUI-Frame

例1:创建图形化界面

/*
*例1:创建图形化界面
*1、创建Frame窗体;
*2、对窗体进行基本设置,比如大小、位置、布局等;
*3、定义组件,如button等;
*4、将组件通过窗体的add方法添加到窗体中;
*5、通过setVisible(true)让窗体显示。
*/
import java.awt.*;
class AwtDemo 
{
	public static void main(String[] args) 
	{
		Frame f=new Frame("my frame");
		
		//f.setSize(500,400);         //设置大小
		//f.setLocation(300,200);     //设置位置
		f.setBounds(500,400,300,200); //设置大小与位置
		f.setLayout(new FlowLayout());//设置布局方式

		Button b=new Button("my button");//定义按钮组件

		f.add(b);          //将按钮组件添加到窗体中
		f.setVisible(true);//让窗体显示
	}
}

对上例中创建的窗体,点击关闭按钮以及自定义按钮等均无反应。这是因为我们尚未对这些按钮编写相应的处理事件代码。对此,我们要介绍事件监听机制。

四、事件监听机制

事件监听机制的组成部分:

1)事件源;2)事件;3)监听器;4)事件处理。

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

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

监听器:将事件所对应的处理方法封装到监听器中;

事件监听机制的运作流程:



下面将分别介绍窗体、鼠标及键盘的事件与相应的监听器

1、窗体事件:

我们想让窗体具备关闭功能

//因为WindowListener的子类WindowAdapter已经实现了WindowListener
		//接口,并覆盖了其中的所有方法。因此,我们只需要继承WindowAdapter,
		//并覆盖我们所需要的方法即可。
		f.addWindowListener(new WindowAdapter() //以匿名内部类的形式实现事件监听器
		{
			public void windowClosing(WindowEvent e)
			{
				System.out.println("关闭窗体");
				System.exit(0);
			}
		});
此时,例1中的窗体就可以关闭了。


2、按钮-Action事件

我们想让按钮具备退出程序的功能。

//按钮支持一个特有监听addActionListener()。
		b.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				System.out.println("通过按钮退出程序!");
				System.exit();
			}
		});

3、鼠标事件

给按钮添加一个鼠标监听。

//鼠标事件
		b.addMouseListener(new MouseAdapter()
		{
			private int count=1;
			private int clickCount=1;
			public void mouseEntered(MouseEvent e)
			{
				System.out.println("鼠标进入到该组件"+(count++)+"次");
			}
			public void mouseClicked(MouseEvent e)
			{
				if(e.getClickCount()==2)
					System.out.println("双击动作"+(clickCount++)+"次");
			}
		});

4、键盘事件

给按钮添加一个键盘监听。

//键盘事件
		b.addKeyListener(new KeyAdapter()
		{
			public void keyPressed(KeyEvent e)
			{
				if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)
					System.out.println("ctrl+enter is run!");
			}
		});

5、对话框dialog

我们希望当地址输入错误时,会跳出对话框提醒用户操作错误。

例2:列出指定目录

/*
*例2:列出指定目录
*在tf中输入目录,在按下转到按钮(或回车键)后,
*ta中列出目录中所包含的文件及文件夹。当目录错误时,弹出对话框。
*/
import java.awt.*;
import java.awt.event.*;
import java.io.File;
class AwtDemo 
{
	public static void main(String[] args) 
	{
		Frame f=new Frame("主窗体");
		    
		f.setBounds(500,400,300,200); 
		f.setLayout(new FlowLayout());

		Button b=new Button("转到按钮");
		final TextField tf=new TextField(60);
		final TextArea ta=new TextArea(25,70);
		final Dialog d=new Dialog(f,"提示信息",true);//对话框
		final Label lab=new Label();
		Button okButton=new Button("确定");
		d.setBounds(500,200,300,150);
		d.setLayout(new FlowLayout());
		f.add(b); 
		f.add(tf);
		f.add(ta);
		d.add(lab);
		d.add(okButton);
		//窗体关闭
		f.addWindowListener(new WindowAdapter() 
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
		//按下转到按钮显示目录
		b.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				String dirPath=tf.getText();
				File dir=new File(dirPath);
				if (dir.exists()&&dir.isDirectory())
				{
					ta.setText("");
					String[] names=dir.list();
					for (String name:names )
					{
						ta.append(name+"\r\n");
					}
				}
				else      //地址输入错误时,弹出对话框
				{
					String info="您输入的地址:"+dirPath+"是错误的,请重新输入!";
					lab.setText(info);
					d.setVisible(true);
				}
			}
		});
		//按下回车键也显示目录
		tf.addKeyListener(new KeyAdapter()
		{
			public void keyPressed(KeyEvent e)
			{
				if(e.getKeyCode()==KeyEvent.VK_ENTER)
				{
					String dirPath=tf.getText();
					File dir=new File(dirPath);
					if (dir.exists()&&dir.isDirectory())
					{
						ta.setText("");
						String[] names=dir.list();
						for (String name:names )
						{
							ta.append(name+"\r\n");
						}
					}
					else
					{
						String info="您输入的地址:"+dirPath+"是错误的,请重新输入!";
						lab.setText(info);
						d.setVisible(true);
					}
				}
			}
		});
		//按下okButton用于退出对话框
	    okButton.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				d.setVisible(false);
			}
		});
		//对话框关闭
		d.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				d.setVisible(false);
			}
		});
		f.setVisible(true);
	}
}

6、菜单

例4:给窗体增加菜单项,并添加打开和存储两个选项

/*
*例4:优化列出指定目录
*给窗体增加菜单项,并添加打开和存储两个选项
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class AwtDemo 
{
	public static void main(String[] args) 
	{
		MyFrame mf=new MyFrame();
		mf.initial();
		mf.events();
		mf.createFrame();
	}
		
}
class MyFrame 
{
	private Frame f;
	private Button b,okButton;
	private TextField tf;
	private TextArea ta;
	private Dialog d;
	private Label lab;
	private FileDialog openDialog,saveDialog;
	private File file;
	private MenuBar mb;  //菜单栏
	private Menu m;      //菜单
	private MenuItem closeItem,openItem,saveItem;//菜单项
	
	public void initial()
	{
		f=new Frame("主窗体");	
		b=new Button("转到按钮");
		okButton=new Button("确定");
		tf=new TextField(60);
		ta=new TextArea(25,70);
		d=new Dialog(f,"提示信息",true);
		lab=new Label();
		openDialog=new FileDialog(f,"打开文件",FileDialog.LOAD);
		saveDialog=new FileDialog(f,"存储文件",FileDialog.SAVE);
		mb=new MenuBar();
		m=new Menu("文件");
		closeItem=new MenuItem("退出");
		openItem=new MenuItem("打开");
		saveItem=new MenuItem("存储");
		
		f.setBounds(500,400,300,200); 
		f.setLayout(new FlowLayout());
		d.setBounds(500,200,300,150);
		d.setLayout(new FlowLayout());
		
		m.add(closeItem);
		m.add(openItem);
		m.add(saveItem);
		mb.add(m);
		f.setMenuBar(mb);
		f.add(b); 
		f.add(tf);
		f.add(ta);
		d.add(lab);
		d.add(okButton);
	}
	
	public void events()
	{
		//closeItem
		closeItem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				System.exit(0);
			}
		});
		//openItem
		openItem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				openDialog.setVisible(true);
				String dirPath=openDialog.getDirectory();
				String fileName=openDialog.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 x)
				{
					throw new RuntimeException("打开文件失败");
				}
			}
		});
		//saveItem
		saveItem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				if(file==null)
				{
					saveDialog.setVisible(true);
					String dirPath=saveDialog.getDirectory();
					String fileName=saveDialog.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 x)
				{
					throw new RuntimeException("存储文件失败");
				}
				
			}
		});
		//窗体关闭
		f.addWindowListener(new WindowAdapter() 
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
		//按下转到按钮显示目录
		b.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				String dirPath=tf.getText();
				File dir=new File(dirPath);
				if (dir.exists()&&dir.isDirectory())
				{
					ta.setText("");
					String[] names=dir.list();
					for (String name:names )
					{
						ta.append(name+"\r\n");
					}
				}
				else
				{
					String info="您输入的地址:"+dirPath+"是错误的,请重新输入!";
					lab.setText(info);
					d.setVisible(true);
				}
			}
		});
		//按下回车键也显示目录
		tf.addKeyListener(new KeyAdapter()
		{
			public void keyPressed(KeyEvent e)
			{
				if(e.getKeyCode()==KeyEvent.VK_ENTER)
				{
					String dirPath=tf.getText();
					File dir=new File(dirPath);
					if (dir.exists()&&dir.isDirectory())
					{
						ta.setText("");
						String[] names=dir.list();
						for (String name:names )
						{
							ta.append(name+"\r\n");
						}
					}
					else
					{
						String info="您输入的地址:"+dirPath+"是错误的,请重新输入!";
						lab.setText(info);
						d.setVisible(true);
					}
				}
			}
		});
		//按下okButton用于退出对话框
		okButton.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				d.setVisible(false);
			}
		});
		//对话框关闭
		d.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				d.setVisible(false);
			}
		});
	}

	public void createFrame()
	{
		f.setVisible(true);
	}
}

延伸阅读:

1、Java事件处理机制 - 事件监听器的四种实现方式;

2、自定义事件监听:java事件机制

3、Java事件机制理解及应用




---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值