黑马程序员:GUI介绍:布局管理器、Frame、事件监听机制、Action事件、鼠标键盘事件、菜单、jar包的双击执行

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

GUI(图形用户界面)

Graphical User Interface(图形用户接口)
CLI(命令行用户接口)
Command line Interface

Java为GUI提供的对象都存在java.awt和javax.swing两个包中
Awt与Swing
java.awt:abstract windows toolkit(抽象窗口工具包),需要调用本地系统方法实现功能,属重量级控件。

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


布局管理器
容器中组件的排放方式,就是布局
常见的布局管理器:
FlowLayout(流式布局管理)
从左到右的顺序排列,Panel默认的布局管理器

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

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

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

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


Frame 窗体
创建图形画界面:
1.创建窗体
2.对窗体进行基本设置,比如大小,位置,布局
3.定义组件
4.将组件通过窗体的add方法添加到窗体中
5.让窗体显示,通过setVisible(true)

Frame(){} //通过这样建立窗体对象没有标题

Frame(String title){} //构造函数中写入窗体标题

Frame f = new Frame("my awt");

setSize(int width, int height); //设置窗体尺寸,x为横向,y为纵向
setVisible(boolean b); //true则窗体可以见,false则窗体隐藏

setBounds(int x, int y, int width, int height) //setSize(),setLocation()两个方法可以通过这一个方法实现
setLocation(int x, int y) //设置窗体在屏幕上的位置,x为距左边边界,y为距顶部边界

设置布局:
setLayout(new FlowLayout()); //使用流式布局

创建按钮:
Button b = new Button("我是一个按钮");
将按钮加到窗体中:
f.add(b);


事件监听机制的特点:
1.事件源:awt包或者swing包中的那些图形界面组件
2.事件:每一个事件源都有自己特有的对应事件和共性事件
3.监听器:将可以触发某一个事件的动作(N个动作,N>=1)都已经封装到了监听器中
以上三者,在java中都已经定义好了,直接获取其对象来用就可以了。
我们要做的事情,就是第四个:对产生的动作进行处理
4.事件处理(引发事件后处理方式)

添加监听器:
addWindowListener(WindowListener w)

implements WindowListener
使用该接口需要覆盖7个方法,而它的子类WindowAdapter已经实现了WindowListener接口,并覆盖了其中的所有方法,所以只要继承自WindowAdapter覆盖我们需要的方法即可

添加监听器示例:

Frame f = new Frame("窗口");
f.addWindowListener(new MyWin()); //加监听器
class MyWin extends WindowAdapter
{
	public void windowClosing(WindowEvent e)
	{
		System.out.println("window closing"+e.toString());
		System.exit(0);//对处程序
	}
}

通过匿名内部类:
Frame f = new Frame("窗口");
f.addWindowListener(new WindowAdapter(){
	public void windowClosing(WindowEvent e)
	{
		System.exit(0);
	}
	//监听激活方法
	public void windowActivated(WindowEvent e)
	{
		System.out.println("我被激活了");
	}
	//监听打开方法
	public void windowOpened(WindowEvent e)
	{
		System.out.println("我被打开了");
	}
});

建议:在写代码的时候,把监听事件和组件分两个方法写,然后在组件方法上调用监听事件,这样做是为了代码优化

Action事件

//让按钮具备退出程序的功能
按钮是事件源,那么就通过按钮组建到API下查阅按钮的特有监听器,发现Button组件下有一个特有监听addActionListener(ActionListener a)

ActionListener接口下就一个方法actionPerformed(ActionEvent e)

代码示例:
but.addActionListener(new ActionListener()
{
	public void actionPerformed(ActionEvent e)
	{
		System.out.println("通过按钮退出了程序");
		System.exit(0);
	}
});

共性事件:鼠标键盘事件
addKeyListener(KeyListener k)
addMouseListener(MouseListener m)

KeyListener接口有相应的子类: KeyAdapter
MouseListener接口有相应的子类: MouseAdapter
监听的具体动作调用什么方法查看API文档
鼠标的例子:
Button but = new Button("这是一个按钮");
but.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++);
	}
});

键盘监听示例:
char getKeyChar() 返回与此事件中的键相关联的字符
int getKeyCode() 返回键关联的整数(ASCII值)
static String getKeyText(int keyCode) 返回描述 keyCode 的 String,如 "HOME"、"F1" 或 "A"。

but.addKeyListener(new KeyAdapter()
{
	//按键盘动作
	public void keyPressed(KeyEvent e)
	{
		System.out.println(e.getKeyChar()+"~~"e.getKeyCode()+"~~"+KeyEvent.getKeyText(e.getKeyCode()));
		//若按了Ctrl+ESC,则退出
		if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ESCAPE)
			System.exit(0);
	}
});

键盘监听示例:只允许输入数字
TextField tf = new TextField(20); //20是列数
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("请输入数字");
			e.consume();//不使用默认方法 这里的默认方法是把字符输入进去
		}
	}
});

练习题:
列出指定目录内容
组件:文本框,文本区,按钮
要求,在文本框中输入Path,通过按钮或者回车后,文本区中显示Path下的目录和文件列表,若输入的Path不存在,则通过Dialog跳出错误提示,Dialog中需要有确定按钮,提示错误信息(在窗体上加文字需要用Label组件)

import java.awt.Button;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;


/*
练习题:
列出指定目录内容
组件:文本框,文本区,按钮
要求,在文本框中输入Path,通过按钮或者回车后,文本区中显示Path下的目录和文件列表,若输入的Path不存在,
则通过Dialog跳出错误提示,Dialog中需要有确定按钮,提示错误信息(在窗体上加文字需要用Label组件)
 */
public class AwtTest {


	private Frame f;
	private Button but;
	private TextField tf;
	private TextArea ta;
	private Dialog errorDia;
	private Button diaBut;
	public void init()
	{
		f = new Frame("文件列表");
		f.setBounds(500,200,400,500);
		f.setLayout(new FlowLayout());
		but = new Button("转到");
		tf = new TextField(41);
		ta = new TextArea(29,45);
		errorDia = new Dialog(f,"错误提示",true);
		diaBut = new Button("确定");
		errorDia.add(diaBut);
		errorDia.setLayout(new FlowLayout());
		errorDia.setBounds(520,400,180,80);
		f.add(tf);
		f.add(but);
		f.add(ta);
		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)
			{
				String dirPath = tf.getText();
				File file = new File(dirPath);
				if(file.exists() && file.isDirectory())
				{
					ta.setText("");
					String[] files = file.list();
					for(String f:files)
					{
						ta.append(f+"\r\n");
					}
				}
				else
				{
					Label info = new Label("您输入的地址:"+dirPath+"有误");
					errorDia.add(info);
					errorDia.add(diaBut);
					errorDia.setLayout(new FlowLayout());
					errorDia.setBounds(520,400,180,80);
					errorDia.setVisible(true);	
					
				}
			}
		});
		errorDia.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				errorDia.setVisible(false);	
			}
		});
		tf.addKeyListener(new KeyAdapter()
		{
			public void keyPressed(KeyEvent ke)
			{
				if(ke.getKeyCode()==KeyEvent.VK_ENTER)
				{
					String dirPath = tf.getText();
					File file = new File(dirPath);
					if(file.exists() && file.isDirectory())
					{
						ta.setText("");
						String[] files = file.list();
						for(String f:files)
						{
							ta.append(f+"\r\n");
						}
					}
					else
					{
						Label info = new Label("您输入的地址:"+dirPath+"有误");
						errorDia.add(info);
						errorDia.setVisible(true);	
					}
				}
			}
		});
		diaBut.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				errorDia.setVisible(false);
			}
		});
		
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		AwtTest awt = new AwtTest();
		awt.init();
	}


}


打开保存文本编辑器例子:

package editool;

/*
 * 练习题:
 * 制作一个图形画界面的编辑器,包含打开、保存功能,再通过包封装,
 * 并用jar打包,且jar包需要具备双击运行的功能
 */
import java.awt.*;
import java.io.*;
import java.awt.event.*;
public class Edit {

	private Frame f;
	private MenuBar mb;
	private Menu m;
	private MenuItem openItem;
	private MenuItem saveItem;
	private FileDialog openDia;
	private FileDialog saveDia;
	private MenuItem exitItem;
	private TextArea ta;
	private File file;
	public void init()
	{
		f = new Frame("简易编辑器");
		f.setBounds(500,200,400,512);
		f.setLayout(new FlowLayout());
		mb = new MenuBar();
		m = new Menu("菜单");
		openItem = new MenuItem("打开");
		saveItem = new MenuItem("保存");
		exitItem = new MenuItem("退出");
		mb.add(m);
		m.add(openItem);
		m.add(saveItem);
		m.add(exitItem);
		ta = new TextArea(29,45);
		f.setMenuBar(mb);
		f.add(ta);
		MyEvent();
		f.setVisible(true);
		
	}
	private void MyEvent()
	{
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
		exitItem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent ae)
			{
				System.exit(0);
			}
		});
		openItem.addActionListener(new ActionListener()
		{
			BufferedReader bfr;
			public void actionPerformed(ActionEvent ae)
			{
				
				openDia = new FileDialog(f,"OPEN",FileDialog.LOAD);
				openDia.setVisible(true);
				String dir = openDia.getDirectory();
				String filename = openDia.getFile();
				if(dir == null || filename ==null) //if(dir == null || filename ==null) Ubuntu下有“最近使用的”dir会为null
					return ;
				file = new File(dir,filename);
				String filePath = file.getAbsolutePath(); //需要考虑该文件是否有权限读取
				try
				{
					bfr = new BufferedReader(new FileReader(filePath));
					String len = null;
					ta.setText("");
					while((len=bfr.readLine())!=null)
					{
						ta.append(len+"\r\n");
					}
				}
				catch (IOException e)
				{
					throw new RuntimeException("文件读取失败");
				}
				finally
				{
					try
					{
						if(bfr!=null);
							bfr.close();
					}
					catch (IOException io)
					{
						throw new RuntimeException("文件关闭失败");
					}
				}
			}
		});
		saveItem.addActionListener(new ActionListener()
		{
			BufferedWriter bfw;
			public void actionPerformed(ActionEvent ae)
			{
				if(file==null)
				{
					saveDia = new FileDialog(f,"保存",FileDialog.SAVE);
					saveDia.setVisible(true);
					String dir = saveDia.getDirectory();
					String filename = saveDia.getFile();
					if(dir==null||filename==null)
						return;
					file = new File(dir,filename);
					saveText();
					
				}
				else
				{
					saveText();
				}
				
			}
			public void saveText()
			{
				try
				{
					bfw = new BufferedWriter(new FileWriter(file));
					bfw.write(ta.getText());
					bfw.flush();
				}
				catch (IOException e)
				{
					throw new RuntimeException("文件保存失败");
				}
				finally
				{
					try
					{
						if(bfw!=null)
						bfw.close();
					}
					catch(IOException e)
					{
						throw new RuntimeException("文件关闭失败");
					}
					
				}
			}
		});
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Edit awt =new Edit();
		awt.init();
	}

}


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值