黑马程序员_GUI 详谈

-------  android培训java培训、期待与您交流! ----------

一.概述

JavaGUI提供的对象都在java.awtjavax.swing这两个包

java.awtbstractWindow ToolKit(抽象窗口工具集,需要调用本地系统方法实现功能,属于重量级控件。

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

“重量级”是指跟平台结合紧密,轻量级与之相反

AWT继承结构图


常见的布局管理器:•

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

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

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

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

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

事件监听机制由四部分组成:事件源(组件)、事件(Event)、监听器(Listener)和事件处理(引发事件后的处理方式)



eg:

/*
 创建图形化界面步骤:
1.创建fram窗体。
2.对窗体进行基本设置。
3.定义组件。
4.将组件通过窗体的add方法添加到窗体中
5.让窗体显示,通过setVisible(true)方法。
 */
import java.awt.*;
import java.awt.event.*;
class  AwtDemo
{
	public static void main(String[] args) 
	{
		Frame f =new Frame("my awt");
		f.setSize(500,400);//设置窗体大小500是宽,400是高
		f.setLocation(300,200);//设置初始显示位置,300是x坐标,200是y坐标
//		上边两个方法可以用它 f.setBounds(x, y, width, height)来统一设置
		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("我被打开了");

			}
		}); 
		//设置frame显示,这时图形界面线程才启动
		f.setVisible(true);
	}
}
class MyWin extends WindowAdapter
{
	public void windowClosing(WindowEvent e)
	{
		System.exit(0);
		//System.out.println("MyWin------------"+e.toString());
	}
}

二.事件

Action事件

按钮对应的是ActionEvent事件,ActionEvent对应的是ActionListener监听器。

ActionListener监听器接口只用一个方法,所以没有相应的Adapter,它是三个没有配适器的监听器接口之一

eg:

import java.awt.*;
import java.awt.event.*;
class  FrameDemo
{
	//定义该图形中所需的组件的引用。
	private Frame f;
	private Button but;

	FrameDemo()
	{
		init();
	}
	//初始化图形界面
	public void init()//初始化
	{
		f= new Frame("day22-MyFrame");

		//对frame进行基本设置。
		f.setBounds(300,100,600,500);
		f.setLayout(new FlowLayout());
		but = new Button("my button");
		//将组件添加到Frame中
		f.add(but);	
		//加载一下窗体上的事件。
		myEvent();
		//显示窗体
		f.setVisible(true);
	}
	//最好把事件处理和GUI组件的基本初始化分离开
	public void myEvent()//这些都是组件的特有事件,还有共性事件。
	{
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.out.println("关闭窗口");
				System.exit(0);//这个方法的 关闭的是虚拟机,退出虚拟机,当然就退出了程序  
			}
		});
		//让按钮具备退出程序的功能。
		/*
		按钮就是事件源,那么选择哪一个监听器呢?通过关闭窗体实例了解到。想要知道那个组件具备什么样的特与监听器,
		需要查看该组件对象的功能。那么通过查阅button的描述,发现支持一个特有监听addActionListener(ActionListener l);
		是没有适配器的少数组件之一,只要事件方法超过3个的组件,都有配适器(Adapter);
		*/
		but.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e) 
			{
				System.out.println("退出,按钮干的");
				System.exit(0);
			}

		});
	}
	//主函数,用于测试
	public static void main(String[] args) 
	{
		new FrameDemo();
	}
}
鼠标事件

MouseEvent,它是所有组件都有的共性事件,所以它的添加监听器方法是定义在Component抽象类中,键盘事件也是共性事件。

它对应的是MouseListener

鼠标单击次数是定义在MouseEvent事件对象中的,在MouseEvent事件对象中还能还封装了触发事件的是鼠标的一些相关信息。

MouseListener有对应的MouseAdapter

键盘事件

KeyEvent事件对象,内部封装了对应于键盘各个键的字段和触发事件的具体按键的信息。

这些信息可以通过该对象对外提供的方法获取到。

keyEvent 对应的事件监听器的KeyListener·,有对应的KeyAdapter

eg:

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("day22-MyFrame");
		//对frame进行基本设置。
		f.setBounds(300,100,600,500);
		f.setLayout(new FlowLayout());
		but = new Button("my button");
		tf = new TextField(10);
		f.add(but);
		f.add(tf);
		myEvent();
		f.setVisible(true);
	}
	public void myEvent()
	{
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
		//给but添加一个键盘侦听器
		but.addKeyListener(new KeyAdapter()
		{
			private int count;
			public void keyPressed(KeyEvent e)
			{
				//判断组合键
				if(e.isControlDown() && e.getKeyCode()==KeyEvent.VK_ENTER)//从父类InputEvent 找isControlDown
					//System.exit(0);
					System.out.println("Ctrl + Enter is down");
				//System.out.println("按下某个键了---"+count++);
				//System.out.println(e.getKeyChar());
				//打印按下的键上在字符串,及键值。
				System.out.println(KeyEvent.getKeyText(e.getKeyCode())+"....."+e.getKeyCode());
			}
		});

		tf.addKeyListener(new KeyAdapter()
		{
			public void keyPressed(KeyEvent e)
			{
				//限定键值的范围
				int code =e.getKeyCode();
				if(!(code>=KeyEvent.VK_0 && code<=KeyEvent.VK_9))
				{
					//不处理,取消掉事件,具有屏蔽键的作用,如果键入是字符非法则不写入文本框。
					e.consume();//从父类InputEvent中获取的方法consume,不按照默认的方法处理该事件。
					System.out.println(code + "....是非法的");
				}
			}
		});
		
		/*
		//给but添加监听器
		but.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e) 
			{
				System.out.println("button action");
			}

		});
	
		//给but添加鼠标监听器
		but.addMouseListener(new MouseAdapter()
		{
			private int count;
			private int clickCount;
			public void mouseEntered(MouseEvent e) 
			{
				System.out.println("鼠标进入组件区域啦--"+count++);				
			}
			public void mouseClicked(MouseEvent e) 
			{
				if(e.getClickCount()==2)
				System.out.println("鼠标双击Button了--"+clickCount++);
			}

		});
		*/

	}

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

	}
}

对话框 dialog 、FileDialog

eg: 目录浏览器

import java.awt.*;
import java.awt.event.*;
import java.io.*;
class  MyWindowDemo
{
	private Frame f;
	private TextField tf;
	private Button but;
	private TextArea ta;

	private Dialog d;
	private Label lab;
	private Button okBut;

	MyWindowDemo()
	{
		init();
	}
	public void init()
	{
	 	f = new Frame("My Window");
		f.setBounds(300,100,500,400);
		f.setLayout(new FlowLayout());

		tf = new TextField(40);
		but = new Button("转到");
		ta = new TextArea(20,50);

		d = new Dialog(f,"提示信息-self",true);
		d.setBounds(400,200,240,100);
		d.setLayout(new FlowLayout()); 

		lab =new Label();
		okBut=new Button("确定");

		d.add(lab);
		d.add(okBut);

		f.add(tf);
		f.add(but);
		f.add(ta);
		
		myEvent();
		f.setVisible(true);

	}
	public void myEvent()
	{
		//添加按钮活动事件监听器
		but.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				showDir();
				
			}
		});
		//添加tf的键盘监听器
		tf.addKeyListener(new KeyAdapter()
		{
			public void keyPressed(KeyEvent e)//用keyTyped事件不成功
			{
				if(e.getKeyCode()==KeyEvent.VK_ENTER)
				{				
					showDir();
				}
			}

		});
		//添加确定按钮活动监听器,鼠标和键盘都能触发。
		okBut.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				d.setVisible(false);
			}
		});
		//添加对话框监听器
		d.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				d.setVisible(false);
			}
		});
		//添加Frame监听器
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
		
	}
	//将展示目录内容的功能封装起来,以方便使用
	private void showDir()
	{
		//获取文本框内容,并封装成File 对象
		String dirPath = tf.getText();
		File dir = new File(dirPath);
		//判断File对象是否存并且是否是目录
		if(dir.exists()&&dir.isDirectory())
		{
			//清空文本区域内容
			ta.setText("");
			//使用File的list方法列出目录下的文件名字
			String [] names = dir.list();
			for(String name:names)
			{
				//append方法可以说实现对文本区域添加文本
				ta.append(name+"\r\n");
			}
		}
		else//如果不是目录则弹出错误对话框
		{
			//其实这个dialog窗体要在这时创建,以优化内存,将其在初始化时就创建是为了演示。
			String info="您输入的信息("+dirPath+"):是错误的,请重新输入";
			lab.setText(info);
			d.setVisible(true);
		}
		//清空文本框内容
		tf.setText("");		
	}

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

菜单MenuBarMenuMenuItem

MenuBar:菜单条,里边只能添加Menu

Menu:可以添加MenuItem菜单条目,如果这个MenuItem是一个Menu,那么这个Menu是一个子菜单。

MenuItem:菜单条目

eg: 记事本

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.JDialog;
public class MyMenuTest 
{
	private Frame f;
	private MenuBar mb;
	private Menu m;
	private MenuItem closeItem,openItem,saveItem;
	private TextArea ta;
	private FileDialog diaOpen,diaSave;
	private File file;

	MyMenuTest()
	{
		init();
	}
	public void init()
	{
		f = new Frame("MyMenuTest");
		f.setBounds(400,300,600,500);
		//f.setLayout(new FlowLayout());//使用默认的边界布局管理器
		
		
		//设置菜单
		mb = new MenuBar();
		m = new Menu("文件");
		openItem = new MenuItem("打开");
		saveItem = new MenuItem("保存");
		closeItem= new MenuItem("退出");
		
		m.add(openItem);
		m.add(saveItem);
		m.add(closeItem);
		mb.add(m);
		//设置文本区域
		ta = new TextArea();
		
		//建立文件打开和保存对话框
		diaOpen = new FileDialog(f,"打开",FileDialog.LOAD);
		diaSave = new FileDialog(f,"保存",FileDialog.SAVE); 
		
		//将菜单条添加到Frame上。
		f.setMenuBar(mb);
		f.add(ta);
		//添加事件
		myEvent();
		
		//设置显示
		f.setVisible(true);
	}
	public void myEvent()
	{			
		//打开文件
		openItem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{	
				//启动文件打开对话框
				diaOpen.setVisible(true);
				//获得选取的文件所在的目录
				String dirPath = diaOpen.getDirectory();
				//获得选取的文件的文件名字,如果没有选取,则返回null(即点击的是取消按钮),这要处理一下
				String fileName = diaOpen.getFile();
				if(dirPath==null && fileName==null)
					return;
				//选取有效文件后,清空文本区域
				ta.setText("");
				//将选取的文件读到文本区域中
				file = new File(dirPath,fileName);
				//对IO异常进行处理,将文件内容加到文本区域中
				try
				{
					BufferedReader bufr = new BufferedReader(new FileReader(file));
					StringBuilder sb = new StringBuilder();
					String line = null;
					while((line=bufr.readLine())!=null)
					{
						sb.append(line+"\r\n");
					}
					ta.append(sb.toString());
					bufr.close();
				}
				catch (IOException ex)
				{
					 throw new RuntimeException("读取失败");
				}
				
			}
		});
		//保存文件
		saveItem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
			//文件是否存在
				//如果文件不存在,就打开文件保存对话框
				if(file==null)
				{
					diaSave.setVisible(true);
					String dirPath = diaSave.getDirectory();
					String fileName = diaSave.getFile();
					file = new File(dirPath,fileName);
					//防止点击取消按钮产生异常,这时直接返回
					if(dirPath==null && fileName==null)
						return;
				}
				//上边的代码保证了文件肯定存在,然后开始保存数据
				try
				{
					BufferedWriter bufw = new BufferedWriter(new FileWriter(file));
					bufw.write(ta.getText());
					bufw.close();
					
				}
				catch (IOException ex)
				{
					throw new RuntimeException();
				}
				
			}
		});

		//通过菜单关闭
		closeItem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
			
				System.exit(0);	
			}
		});
		//frame关闭事件处理
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
	}
	public static void main(String[] args) 
	{
		new MyMenuTest();
	}
}
GUI 双击 Jar包执行

步骤

1.      在源文件的第一行加上包:package menu

2.      dos命令行中启动“javac  -d  d:\MyMenuTest.java”命令。

3.      在menu包所在目录下,新建一个名为“1.txt”的文本文档,里边录入一下内容:
Main-Class: menu.MyMenuTest













------- android培训java培训、期待与您交流! ----------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值