黑马程序员——GUI(1)基本窗体组件

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

java的GUI真是方便!Frame f=new Frame();f.setVisible(true);一个窗体就可以看见了。


先说下总结:通过视频学习,总的来说,我觉得写一个GUI程序分为三个部分:1.建造GUI2.注册监听3.实现功能

一、AWT体系:

GUI使用的包是java.awt.*;//awt = Abstract Window Toolkit

这个包也是其他高级GUI工具的基础。基础学习阶段应当掌握好AWT的使用。

体系框架:


GUI中的组件分为2类,容器和非容器。可以向容器中添加组件,但是不能向非容器中添加容器。比如不能向按钮中添加一个Frame。

容器中主要的区别应该是Frame和Dialog,Frame是最初可见的。但是Dialog应当是发生了什么事件才会弹出的对话框。

二、建造GUI

 * 制作GUI的步骤:
 * 1.建立窗体。
 * 2.设置窗体的属性。
 * 3.建立组件。
 * 4.添加组件
 * 5.设置组件的属性
 * 6.设置窗体为可见。

这样就可以制作出一个GUI了,但是这样制作出的GUI无法响应用户的动作。比如关闭窗体。
为了能让用户和GUI进行互动,必须给相关的组件添加监听器,当用户发生监听器所监听的行为,则组件会产生相应的事件。
监听器接收到相应的事件后则会有相应的处理,通过这些处理响应用户的动作。


三、事件监听机制:


1.Listener注册在Component上。

2.外部Action触发Component上注册的监听器

3.Component生成对应的Event。

4.Listener捕获到Event。

5.Listener处理Event。


四、窗体的常见布局: 

 * 1)FlowLayout:流式布局管理器。从左向右排列,是Panel默认的布局管理器
 * 2)BorderLayout:边界式布局管理器,东南西北中的排列方式,是Frame的默认布局管理器。如果窗体中只有一个组件,将会覆盖整个窗体。
 * 3)GridLayout:网格式布局管理器,规则的矩阵
 * 4)CardLayout:卡片式布局管理器,即选项卡
 * 5)GridBayLayout:网格包布局管理器,非规则矩阵
 * 
 * 若存在多种布局方式,为了让这些布局可以共存,应当:
 * 1)使用Panel将窗体划分为不同区域,
 * 2)然后设置Panel为不同的布局,
 * 3)再将相应内容添加到对应的Panel中。

五、文本组件相关

1.TextField和TextArea

TextField单行,功能少,TextArea多行,功能多,可以设置是否能编辑,滚动条。

2.关于键盘输入的keyListener的一些问题:
 * 1).keyTyped 与 keyPressed和keyReleased:
 * 用keyTyped方法表示键入字符的动作,主要是用于判断输入的字符是什么
 * 用keyPressed和keyReleased方法表示键盘操作的动作,主要用于判断按下的按键是什么
 * 2).getKeyChar 与getKeyCode和getKeyText
 * 这3个方法是根据对应的方法使用的:
 * 用keyTyped方法表示键入字符动作,用getKeyChar()来获取键入的字符
 * 用keyPressed和keyReleased方法表示键盘动作,用getKeyCode()来获取表示按键的键盘码,用KeyEvent.getKeyText(e.getKeyCode())以获取输入的按键的含义。
 * getKeyText可以表示出Ctrl+C: 
 * public void keyPressed(KeyEvent e)
{
newPrint(KeyEvent.getKeyText(e.getKeyCode())+":"+e.getKeyCode());

if(KeyEvent.VK_ESCAPE==e.getKeyCode())
System.exit(0);
//isControlDown()判断ctrl是否按下,判断组合按键功能
if(e.isControlDown()&&KeyEvent.VK_C==e.getKeyCode())
{
newPrint("ctrl+c");
}
}


需要说明的是:

1.GUI由另一个线程控制。这是非常必要的,如果只有一个线程,那么就会一直卡在GUI界面,不能进行其他操作。

2.GUI传递参数一半第一个是横向相关的,第二个是纵向相关的

3.ActionListener

对于Button ,有ActionListener()和MouseListener(),先响应的是MouseListener()后响应的是ActionListener(),且ActionListener()不光会响应鼠标,也可以响应键盘。按回车也会产生ActionEvent


练习,制作一个窗体程序,这个程序是未完成的,有待后面继续补充:


/**
 * 制作一个GUI
 * 制作GUI的步骤:
 * 1.建立窗体。
 * 2.设置窗体的属性。
 * 3.建立组件。
 * 4.添加组件
 * 5.设置组件的属性
 * 6.设置窗体为可见。
 * 
 * 	这样就可以制作出一个GUI了,但是这样制作出的GUI无法响应用户的动作。比如关闭窗体。
 * 为了能让用户和GUI进行互动,必须给相关的组件添加监听器,当用户发生监听器所监听的行为,则组件会产生相应的事件。
 * 监听器接收到相应的事件后则会有相应的处理,通过这些处理响应用户的动作。
 * 
 * 窗体的常见布局: 
 * 1)FlowLayout:流式布局管理器。从左向右排列,是Panel默认的布局管理器
 * 2)BorderLayout:边界式布局管理器,东南西北中的排列方式,是Frame的默认布局管理器。如果窗体中只有一个组件,将会覆盖整个窗体。
 * 3)GridLayout:网格式布局管理器,规则的矩阵
 * 4)CardLayout:卡片式布局管理器,即选项卡
 * 5)GridBayLayout:网格包布局管理器,非规则矩阵
 * 
 * 若存在多种布局方式,为了让这些布局可以共存,应当:
 * 1)使用Panel将窗体划分为不同区域,
 * 2)然后设置Panel为不同的布局,
 * 3)再将相应内容添加到对应的Panel中。
 * 
 * TextField单行,功能少,TextArea多行,功能多,可以设置是否能编辑,滚动条。
 * 
 * 关于键盘输入的keyListener的一些问题:
 * 1.keyTyped 与	keyPressed和keyReleased:
 * 		用keyTyped方法表示键入字符的动作,主要是用于判断输入的字符是什么
 * 		用keyPressed和keyReleased方法表示键盘操作的动作,主要用于判断按下的按键是什么
 * 2.getKeyChar 与getKeyCode和getKeyText
 * 		这3个方法是根据对应的方法使用的:
 * 			用keyTyped方法表示键入字符动作,用getKeyChar()来获取键入的字符
 * 			用keyPressed和keyReleased方法表示键盘动作,用getKeyCode()来获取表示按键的键盘码,用KeyEvent.getKeyText(e.getKeyCode())以获取输入的按键的含义。
 * 			getKeyText可以表示出Ctrl+C
 * 
 * 			public void keyPressed(KeyEvent e)
			{
				newPrint(KeyEvent.getKeyText(e.getKeyCode())+":"+e.getKeyCode());
				
				if(KeyEvent.VK_ESCAPE==e.getKeyCode())
					System.exit(0);
				//isControlDown()判断ctrl是否按下,判断组合按键功能
				if(e.isControlDown()&&KeyEvent.VK_C==e.getKeyCode())
				{
					newPrint("ctrl+c");
				}
			}
 * 
 * 关于ActionListener
 * 对于Button ,有ActionListener()和MouseListener(),先响应的是MouseListener()后响应的是ActionListener(),且ActionListener()不光会响应鼠标,也可以响应键盘。按回车也会产生ActionEvent
 * 
 * 	
 * */

package test;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class CardEvaluatorGUI {
	Frame fBase;
	Label lblGameName;
	TextField tfSearch;
	Button btnSearch;
	Button btnReset;
	Button btnUpdate;
	Label lblAPPID;
	TextField tfID;
	Button btnAdd;
	Button btnResult;
	TextArea taInfo;
	Label lblResult;
	
	
	//搜索的关键字,由tfSearch获取。
	String keyWords;
	//保存游戏的集合。
	HashSet<Card> bundleContent;
	String tmpAppid;
	
	CardEvaluatorGUI() {
		InitGUI();
		bundleContent=new HashSet<Card>();
		
	}

	private void InitGUI() {
		// 通过Toolkit.getDefaultToolkit().getScreenSize()的width和height字段,可以获取屏幕的宽和高,也就是分辨率。
		int screenWidth = (int) Toolkit.getDefaultToolkit().getScreenSize().width;
		int screenHeight = (int) Toolkit.getDefaultToolkit().getScreenSize().height;

		// 新建一个窗体,参数为窗体上的标题名
		fBase = new Frame("Card Evaluator");
		// setBounds(x,y,w,h)可以设置窗体在屏幕上的位置和大小。
		fBase.setBounds(screenWidth / 4, screenHeight / 4, screenWidth / 2,
				screenHeight / 2);
		// setLayout()设置窗体的布局。
		// 为了让组件到大概的位置,我使用了空布局,手动给组件定位。
		fBase.setLayout(null);
		{

			// Label是标签。新建一个标签可以在参数中写入标签内容,还可以通过Label的字段设置标签文字的对齐方式,这里我用Label.RIGHT设置成右对齐。
			lblGameName = new Label("游戏名:", Label.RIGHT);
			// TextField允许编辑单行文本的文本组件。
			tfSearch = new TextField();
			// Button按钮
			btnSearch = new Button("查询");
			btnReset = new Button("重置/清空");
			btnUpdate = new Button("更新数据");
			lblAPPID = new Label("APPID:", Label.RIGHT);
			tfID = new TextField();
			btnAdd = new Button("添加");
			btnResult = new Button("评估价值");
			// TextArea 显示文本的多行区域
			taInfo = new TextArea();
			// 设置文本区域不可编辑,只能读取。
			taInfo.setEditable(false);
			lblResult = new Label("分析结果:");

			regLinstener();
			// 将组件添加到窗体上。
			fBase.add(lblGameName);
			fBase.add(tfSearch);
			fBase.add(btnSearch);
			fBase.add(btnReset);
			fBase.add(btnUpdate);
			fBase.add(lblAPPID);
			fBase.add(tfID);
			fBase.add(btnAdd);
			fBase.add(btnResult);
			fBase.add(taInfo);
			fBase.add(lblResult);
			// 设置组件在窗体上的位置x,y,w,h
			lblGameName.setBounds(0, screenHeight / 20, screenWidth / 10,
					screenHeight / 20);
			tfSearch.setBounds(screenWidth / 10, screenHeight / 20,
					screenWidth / 10, screenHeight / 20);
			btnSearch.setBounds(screenWidth / 10 * 2, screenHeight / 20,
					screenWidth / 10, screenHeight / 20);
			btnReset.setBounds(screenWidth / 10 * 3, screenHeight / 20,
					screenWidth / 10, screenHeight / 20);
			btnUpdate.setBounds(screenWidth / 10 * 4, screenHeight / 20,
					screenWidth / 10, screenHeight / 20);

			lblAPPID.setBounds(0, screenHeight / 20 * 2, screenWidth / 10,
					screenHeight / 20);
			tfID.setBounds(screenWidth / 10, screenHeight / 20 * 2,
					screenWidth / 10, screenHeight / 20);
			btnAdd.setBounds(screenWidth / 10 * 2, screenHeight / 20 * 2,
					screenWidth / 10, screenHeight / 20);
			btnResult.setBounds(screenWidth / 10 * 3, screenHeight / 20 * 2,
					screenWidth / 10 * 2, screenHeight / 20);

			taInfo.setBounds(screenWidth / 2 / 80, screenHeight / 20 * 3,
					screenWidth / 2 * 39 / 40, screenHeight / 20 * 6);

			lblResult.setBounds(screenWidth / 2 / 80, screenHeight / 20 * 9,
					screenWidth / 2 * 39 / 40, screenHeight / 20);

		}

		fBase.setVisible(true);

	}

	private void regLinstener() {
		/*
		 * 窗体增加一个关闭的监听器。
		 * 向某个组件添加监听器一般是调用组件对象的addXXXListener方法,需要一个监听器对象作为参数,
		 * 一般都是与方法对应的XXXListener接口,但是为了方便使用都会派生出一个适配器子类XXXAdapter。
		*/
		fBase.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
			
		});
		//TextField增加一个按键监听器。如果按下回车相当于点了“查询”
		tfSearch.addKeyListener(new KeyAdapter(){
			public void keyPressed(KeyEvent e) {
				if(KeyEvent.VK_ENTER==e.getKeyCode())
				{
					keyWords=tfSearch.getText();//获取TextField中的文本。
					searchGameDialog();
					tfSearch.setText("");
				}
			}			
		});
		//按钮增加一个动作监听器。对于Button ,有ActionListener()和MouseListener(),先响应的是MouseListener()后响应的是ActionListener(),且ActionListener()不光会响应鼠标,也可以响应键盘。按回车也会产生ActionEvent
		btnSearch.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				keyWords=tfSearch.getText();
				searchGameDialog();
				tfSearch.setText("");
			}
		});
		//重置按钮 清空所有保存的内容,同时清空文本区所有内容。
		btnReset.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				bundleContent.clear();
				keyWords="";
				tfSearch.setText("");
				taInfo.setText("");
			}
		});
		//更新按钮 更新本地卡片“数据库”。
		btnUpdate.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				updateDB();
			}
		});
		//输入游戏APPID,如果按下回车相当于点击了添加
		tfID.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e)
			{
				if(KeyEvent.VK_ENTER==e.getKeyCode())
				{
					tmpAppid=tfID.getText();
					getAppid(tmpAppid);					
					tfID.setText("");					
				}
			}
		});	
		//以APPID方式添加游戏
		btnAdd.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				tmpAppid=tfID.getText();
				getAppid(tmpAppid);					
				tfID.setText("");
			}
		});
		//列出统计结果
		btnResult.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				showCountInfo();
			}			
		});		
	}
	
	private void searchGameDialog() {
		// TODO 自动生成的方法存根
		
	}
	//更新本地卡片“数据库”。
	private void updateDB() {
		// TODO 自动生成的方法存根
		
	}
	//添加所查游戏
	private void addGame(int tmpid) {
		// TODO 自动生成的方法存根
		
	}
	//用APPID添加游戏
	private int getAppid(String text) {
		// TODO 自动生成的方法存根

/*		int tmpid=-1;
		if(-1!=(tmpid=getAppid(tfID.getText()))){
			addGame(tmpid);
		}*/
		return 0;
	}
	
	private void showCountInfo() {
		// TODO 自动生成的方法存根
		
	}
	
	
	public static void main(String[] args) {
		new CardEvaluatorGUI();
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值