黑马程序员——Java基础---GUI

-------  android培训 java培训 、java学习型技术博客、期待与您交流! ----------
一、概述
  1. CLI(Command line User Interface):命令行用户接口。是常见的Dos命令行操作。需要记忆一些常用的命令,操作不直观。
  2. GUI(Graphical User InterFace):图形用户接口。用图形的方式,来显示计算机操作的界面,方便直观。
  3. Java为GUI提供的对象都存在在java.Awt和javax.Swing两个包中。
    • java.Awt(Abstract Window ToolKit):抽象窗口工具包。需要调用本地系统方法实现功能。属重量级件。
    • javax.Swing:在Awt的基础上建立的一套图形界面系统,其中提供了更多的组件,且完全由Java实现,增强了移植性,属轻量级件。
二、继承关系图

  • Container:为容器,是一个特殊的组件,该组件中可以通过add方法添加其他组件进来。
  • Container常用子类:Window   Panel(面板,不能单独存在。)
  • Window常用子类:Frame  Dialog
三、布局管理器
  • 容器中的组件的排放方式,就是布局。常见的布局管理器:
    1. FlowLayout:流式布局管理器。从左到右的顺序排列。Panel默认的布局管理器。
    2. BorderLayout:边界布局管理器。 东,西,南,北,中。Frame默认的布局管理器。
    3. GridLayout:网络布局管理器。规则的矩阵。
    4. CardLayout:卡片布局管理器。选项卡。
    5. GridBagLayout:网络包布局管理器。 非规则的矩阵。
四、简单窗体创建过程
  1. 创建Frame窗体。
    •  Frame f = new Frame("my awt");
  2. 对窗体进行基本设置。
    • 比如:大小,位置,布局。 Frame创建后默认的布局是边界式布局, 在没有设置边界坐标时,为居中填充。  
      • 对窗体大小设置: 500横向坐标,400纵向坐标。
      • f.setSize(500,400);
      • 设置窗体出现位置:300顶点距左边距离,200顶点距上边距离。
      • f.setLocation(300,200);
      • 设置布局管理,流式布局。
      •  f.setLayout(new FlowLayout());
  3. 定义组件。
    • Button b = new Button("按钮");  
  4. 将组件通过窗体的add方法添加到窗体中。
    • 添加按钮: f.add(b); 
  5. 让窗体显示,通过setVisible(true)。
    • f.setVisible(true);
五、事件监听机制组成
  1. 事件源(组件)
    • 就是Awt包或者Swing包中的那些图形界面组件。 
  2. 事件(Event)
    • 每一个事件源都有自己特有的对应事件和共性事件。
  3. 监听器(Listener)
    • 将可以出发某一个事件的动作(不只一个动作)都已经封装到了监听器中。
  4. 事件处理(引发事件后处理方式)。
    • 我们要做的事情是:对产生的动作进行处理。
  •  注:前三者,在Java中都已经定义好了。直接获取其对象来用就可以了。,
六、适配器:Adapter
  • 适配器出现的原因是:方便创建监听器对象。
  • 因为: 监听器里有多个方法,而我们只需要用其中的一个或几个。覆盖全部方法比较麻烦,所以监听器给我们提供了一个已有的子类 ,
  • 将监听器的所有方法都覆盖完,我们只要继承这个子类,也就是适配器,使用我们所需要的方法即可。

七、事件监听机制流程图


八、事件监听机制流程
  1. 确定事件源 :窗体或组件。
    • 如:窗体作为事件源 
    • Frame frame = new Frame(“myFrame”);
  2. 通过事件源对象的addXXXListener()方法将侦听器注册到该事件源上。
    • 如:添加窗口监听器
    • frame. addWindowListener(WindowListener l);
  3. 该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。一般用匿名内部类实现。 在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收。
    •  如:
      frame.addWindowListener(new WindowAdapter()
      {
      	public void windowClosing(WindowEvent e)
      	{
      		//退出程序 
      		System.exit(0);
      	}
      }
  4. 事件触发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过getSource()或者,getComponent()获取。)
    • 如:关闭frame窗体事件触发,
    • 关闭窗体动作触发到frame上,产生事件对象new WindowAdapter()
    • 通过frame将new WindowAdapter()传递给监听器的windowClosing(WindowEvent e) 方法
    • 执行windowClosing(WindowEvent e) 方法。
九、添加监听器

想要知道哪个组件具备什么样的特有监听器,需要查看该组件对象的功能。 
示例:
import java.awt.*;
import java.awt.event.*;
class  MouseAndKeyEvent
{
	//定义该图形中所需要的组件的引用。
	private Frame f;
	//添加按钮 在此建立引用,事件可以作用于整个类。
	private Button but;
	//添加文本框
	private TextField tf;
	MouseAndKeyEvent()
	{
		init();
	}
	//图形化界面初始化
	public void init()
	{
		f = new Frame("my frame");
		//对frame进行基本设置
		f.setBounds(300,100,600,500);
		f.setLayout(new FlowLayout());

		tf = new TextField(20);
		but = new Button("my button");
		//将组件条件到frame中
		f.add(tf);
		f.add(but);
		//加载一下窗体上事件
		myEvent();

		//显示窗体
		f.setVisible(true);
		//不在此写事件,要不事件和图形化界面分离开。
	}
	private void  myEvent()
	{	
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
		but.addActionListener(new ActionListener()
		{	
			public void actionPerformed(ActionEvent e)
			{
				System.out.println("action OK");
			}
		});
		//给Button添加鼠标监听
		but.addMouseListener(new MouseAdapter()
		{
			int count = 1;
			int ClickCount = 1;
			public void mouseEntered(MouseEvent e)
			{	
				System.out.println("鼠标进入组件" + count++);
			}
			public void mouseClicked(MouseEvent e)
			{
				if(e.getClickCount()==2)
					System.out.println("鼠标双击动作");
				//System.out.println("单击动作"+ClickCount++);
			}
		});
		//给Button添加键盘监听
		but.addKeyListener(new KeyAdapter()
		{
			public void keyPressed(KeyEvent e)
			{
				int code = e.getKeyCode();
				if(e.isControlDown()&& code==KeyEvent.VK_ENTER)
					System.out.println("ctrl+enter is run");
				if(code == KeyEvent.VK_ESCAPE)
					System.exit(0);
					
			}
		});
		//
		tf.addKeyListener(new KeyAdapter()
		{
			public void keyPressed(KeyEvent e)
			{
				int code = e.getKeyCode();
				if(!(code>=KeyEvent.VK_0 && code<=KeyEvent.VK_9))
				{
					System.out.println(code+"...是非法的");
					e.consume();
				}
			}
		});

	}


	public static void main(String[] args) 
	{
		new MouseAndKeyEvent();
	}
}

十、菜单(Menu)

1.菜单继承体系图:

2.使用说明:

  1. Menu:菜单,继承MenuItem;有右三角的图标存在,可添加Menu和MenuItem
  2. MenuBar:菜单栏,可添加菜单和菜单条目。一般先创建菜单栏,再创建菜单。
  3. MenuItem:菜单条目,也称菜单项,是最终的菜单项。
  4. 菜单的事件处理和组件一样,可以对类型为MenuItem和Menu的对象这个事件源添加活动监听ActionListener,并进行相关的事件处理。
  5. 通过setMenuBar()方法,将菜单添加到Frame中。
十一、FileDialog类

作用:显示一个对话框窗口,用户可以从中选择文件。
FileDialog(Frame parent, String title, int mode) :
mode :对话框的模式,可以是  FileDialog.LOAD 或  FileDialog.SAVE
FileDialog.LOAD,打开。
FileDialog.SAVE,保存。
示例:
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class MyMenuTest 
{   
	//创建窗体 
	private Frame window;
	//创建文本框 
	private TextArea fileInfo;
	//创建菜单 
	private Menu fileMenu;
	//创建菜单栏 
	private MenuBar bar;
	//创建子菜单 
	private MenuItem openItem,saveItem,closeItem;
	//创建文件对话框
	private FileDialog openDia,saveDia;
	//创建文件对象
	private File file;

	MyMenuTest()
	{
		init();
	}
	//窗体初始化 
	public void init()
	{
		window = new Frame("我的文件");
		//设置窗体布局 
		window.setBounds(300,100,750,600);
		//定义个组件
		bar = new MenuBar();
		fileInfo = new TextArea();
		fileMenu = new Menu("文件");
		openItem = new MenuItem("打开");
		saveItem = new MenuItem("保存");
		closeItem = new MenuItem("退出");
		//将文本框添加到窗体
		window.add(fileInfo);
		//添加子菜单 
		fileMenu.add(openItem);
		fileMenu.add(saveItem);
		fileMenu.add(closeItem);
		//将菜单添加到菜单栏 
		bar.add(fileMenu);
		//在窗体上显示菜单栏 
		window.setMenuBar(bar);
		//设置文本对话框模式
		openDia = new FileDialog(window,"打开",FileDialog.LOAD);
		saveDia = new FileDialog(window,"打开",FileDialog.SAVE);
		//加载事件
		myEvent();
		//显示窗体 
		window.setVisible(true);
	}
	public void myEvent()
	{ 
		//添加窗体监听器 
		window.addWindowListener(new WindowAdapter()
		{
			//关闭窗体 
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
		//给关闭菜单添加监听器 
		closeItem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				System.exit(0);
			}
		});
		//给打开菜单添加监听器 
		openItem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				//显示文本对话框。 
				openDia.setVisible(true);
				//获取文件对话框目录 
				String dirPath = openDia.getDirectory();
				//获取文件名 
				String fileName = openDia.getFile();
				//判断文件是否为null 
				if(dirPath==null||fileName==null)
				return; 
				//清空文本框
				fileInfo.setText("");
				//将文件封装成流对象 
				file = new File(dirPath,fileName);
				//把文件数据读取到文本框 
				try
				{
					BufferedReader bufr = new BufferedReader(new FileReader(file));
					String line = null;
					while((line=bufr.readLine())!=null)
					{
						fileInfo.append(line+"\r\n");
					}
					bufr.close(); 
				}
				catch (IOException ex)
				{
					throw new RuntimeException("读取失败");
				}
			}
		});
		//给保存菜单添加监听器
		saveItem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
					  //判断文件是否存在 
				if(file==null)
				{
					saveDia.setVisible(true);
					String dirPath = saveDia.getDirectory();
					String fileName = saveDia.getFile();
					if(dirPath ==null||fileName== null)
					return;
					file = new File(dirPath,fileName);
				}
				try
				{
					BufferedWriter bufw = new BufferedWriter(new FileWriter(file));
					String text = fileInfo.getText();
					bufw.write(text);
					//bufw.flush();
					bufw.close();
				}
				catch (IOException ew)
				{
					throw new RuntimeException("保存失败");
				}
			}
		});
	}

	public static void main(String[] args) 
	{
		new MyMenuTest();
	}
}
十二、将执行文件打成能运行jar包
  • 图形化界面需要通过图形化界面的形式运行程序,而不是是用Dos命令行执行,这就需要将程序的class文件打包。
DOS命令生成jar包步骤:
  1. 导入一个包,没有则需创建一个包,如package mymenu;
  2. 生成包:通过编译javac -d c:\myclass 类名.java,此时则在c盘下的myclass文件夹下生成了所有的.class文件
  3. 在此目录下新建一个文件,如info.txt或者其他任意名称任意扩展名的文件都可,然后在其中编辑固定的格式:“Main-Class: mymenu.类名”,只写引号中的内容。
    • 写引号中的内容要注意:
    1. 需要需要在冒号后有一个空格,如果无空格:在编译的时候,就会报IO异常,提示无效的头字段,即invalidheader field。这说明1.txt在被IO流读取。
    2. 在文件末尾要回车,如果无回车:在列表清单.MF中不会加入相应的加载主类的信息,也就是说配置清单的属性主类名称不会加载进清单中,也就不会执行
  4. 编译:jar -cvfm my.jar 1.txt mymenu即可。如果想添加其他信息,则直接编译jar即可得出相应的命令
  5. 此时双击即可执行。
用Eclipse打jar包
  • Eclipse通过导出的方式(右键单击项目,之后选择Export)打包java类文件生成jar包。
    • 方法一:(在项目工程没有引用外部jar包时,直接导出) 
      • 选中工程---->右键,Export...--->Java--->JAR file--->next-->选择jar file的路径及名称-->next-->next---> 选择main class--->finish. 
    • 方法2: 当工程引用了其他的外部jar时,由于eclipse不支持同时导出外部jar包的功能,所以比较麻烦一点;具体步骤如下: 
      • 生成manifest file:选中工程--->右键,Export--->Java--->JAR file--->选择jar file的路径及名称--->next--->next--->next;
注意: jar文件必须在系统中注册,才能运行。
  • 注册方法:
    • XP系统:
    1. 打开任意对话框,在菜单栏点击工具按钮,选择文件夹选项。
    2. 选择新建,将扩展名设置为jar,确定。
    3. 选择高级,可更改图标,然后点击新建,命名为open,
    4. 在用于可执行应用程序中,点浏览,将jdk下的bin的整个文件路径添加进来,并在路径后添加-jar即可。
    • win7系统:
    1. 改变打开方式:右击.jar文件,点击打开方式,选择默认程序为jdk下bin中的javaw.exe应用程序。
    2. 修改关联程序的注册表:打开注册表(win+r),找到注册表路径\HKEY_CLASSES_ROOT\Aplications\javaw.exe\shell\open\command下的字符串值,右击点修改,在原路径的中添加-jar,如:"C:\ProgramFiles\Java\jre6\bin\javaw.exe" -jar "%1",注意-jar两边要有空格,保存。
    3. 双击即可执行jar程序,如果仍不能执行,则需下载最新版的jdk。

-------  android培训 java培训 、java学习型技术博客、期待与您交流! ----------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值