黑马程序员——GUI

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------


GUI(图形用户界面)

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

· CLI:Command line User Interface(命令行用户接口)。就是常见dos命令操作,需要记忆一些常用命令,操作不直观

例:比如,创建文件夹,或者删除文件等。使用command命令创建文件等,需要记住很多命令。

· java为GUI提供的对象都在java.Awt和java.Swing两个包中

Awt和Swing:

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

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

继承关系图:


Container:为容器,是一个特殊的组件,该组件可以通过add方法添加其他组件进来。

布局管理器

· 容器中组件的排序方式,就是布局

· 常见的布局管理器:

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

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

3. GridLayout(网络布局管理器):规则的矩阵

4. CardLayout(卡片式布局管理器):选项卡

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

· 建立一个简单的窗体,代码示例:

//Container常用子类:Window Panel(面板不能单独存在)
//Window常用子类:Frame Dialog
//简单窗体创建过程:
Frame f = new Frame("my window");
f.setLayout(new FlowLayout());
f.setSize(400, 500);//设置窗体大小
f.setLocation(500, 400);//设置窗体显示位置
f.setVisible(true);//设置窗体可见
· 创建图形化界面步骤:

1. 创建frame界面

2. 对窗体进行基本设置

3. 定义组件

4. 将组件通过窗体的add方法添加到窗体中

5. 让窗体显示,通过setVisible(true)

事件监听机制:

· 用户对组件的操作,就是一个事件,那么产生事件的组件就是事件源。接收并处理事件,与用户进行交互的行为就是事件处理器。这些处理方式都封装在监听器中。

事件坚挺机制的组成:

· 事件源(组件)

· 事件(Event)

· 监听器(Listener)

· 事件处理器(引发事件后的处理方式)

事件监听机制流程图:黑马程序员——GUI_第1张图片

事件监听机制步骤:

1. 确定事件源(容器或组件)

2. 通过事件源对象的addXXXListener()方法将监听器注册到该事件源上

3. 该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象(一般使用匿名内部类)

4. 在覆盖方法时,方法的参数一般是XXXEvent类型的变量接收

5. 事件触发后会把事件打包成对象传递给变量(其中包括事件源对象,通过getSourse()或者getComponent()获取)

· 代码示例:通过按钮关闭窗体

private Frame f;
//通过构造函数初始化
public CloseWindowDemo(){
	init();
}
private void init() {
	f = new Frame("my window");
	//设置属性信息
	f.setBounds(400, 500, 500, 600);
	f.setVisible(true);
	windowEvent();
}
private void windowEvent() {
//添加关闭监听器
	f.addWindowListener(new WindowAdapter() {
		public void windowClosing(WindowEvent e) {
			System.exit(0);
		}
	});
}

对话框:

· Dialog类:在创建Dialog类时,需要依赖于一个Frame,形成一个最初不可见的对话框。在参数的最后一位还可以传入true或者flase,如果传入的是true,则在对话框没消失时,所依赖的窗体不可操作

代码示例:

Frame f = new Frame();
Dialog d = new Dialog(f,true);
· FileDialog类:Dialog的子类,构造函数可以传递两种模式。一种是FiaDialog.LOAD:加载;一种是FileDialog.SAVE。保存

菜单继承体系:

黑马程序员——GUI_第2张图片

· MenuBar:菜单条目,可以通过Frame中的setMenuBar()方法添加菜单条目

· Menu是一个菜单的按钮,MenuBar中的add方法可以添加Menu

· Menu是MenuItem的子类,Menu的add方法可以添加MenuItem

也就是说,Menu是一个有下拉选框的菜单按钮;而MenuItem是菜单的一个实现按钮。

· 先创建MenuBar,在MenuBar中添加Menu或者MenuItem,Menu中可以添加MenuItem

完整代码示例:需求:一个简单的记事本

public class NotePadTest {

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

}

class NotePad {
	
	private Frame f;//窗体组件
	private MenuBar fileMenu;//菜单组件
	private Menu fileM;
	private MenuItem saveFile,openFile,exit;//菜单项
	private TextArea area;
	
	private FileDialog saveFileDialog;
	private FileDialog loadFileDialog;
	private File file;
	
	public NotePad() {
		init();
	}
	
	private void init() {
		//窗体初始化
		f = new Frame("notepad");
		//f.setLayout(new FlowLayout());
		f.setBounds(500, 100, 500, 600);
		f.setVisible(true);
		
		//给窗体添加文本区域
		area = new TextArea();
		f.add(area);
		
		//菜单初始化,给菜单添加子菜单
		fileMenu = new MenuBar();
		fileM = new Menu("file");
		saveFile = new MenuItem("save");
		openFile = new MenuItem("open file");
		exit = new MenuItem("exit");
		
		fileMenu.add(fileM);
		
		fileM.add(openFile);
		fileM.add(saveFile);
		fileM.add(exit);
		
		//窗体添加菜单组件
		f.setMenuBar(fileMenu);
		
		windowEvent();
	}
	
	private void windowEvent() {
		
		//窗体的保存动作监听
		saveFile.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				//如果是新文件的话,就打开对话框提示
				if(file==null) {
					//对话框初始化
					saveFileDialog = new FileDialog(f, "保存文件", FileDialog.SAVE);
					saveFileDialog.setVisible(true);
					
					//从对话框中获取信息并封装成一个文件
					String filePath = saveFileDialog.getDirectory();
					String fileName = saveFileDialog.getFile();
					
					//当没有选择文件时,则之间结束
					if(filePath == null || fileName == null) return;
					file = new File(filePath,fileName);
				}
				
				//将文本区域的内容写到要保存的文件中
				BufferedWriter bufw = null;
				try {
					bufw = new BufferedWriter(new FileWriter(file));
					String text = area.getText();
					bufw.write(text);
				} catch (IOException e2) {
					throw new RuntimeException("文件保存失败");
				} finally {
					if(bufw!=null)
						try {
							bufw.close();
						} catch (IOException e1) {
							e1.printStackTrace();
						}
				}
			}
		});
		
		//窗体的打开动作监听
		openFile.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				//对话框初始化
				loadFileDialog = new FileDialog(f,"openfile");
				loadFileDialog.setVisible(true);
				//从打开文件中获取信息并封装成File
				String fileName = loadFileDialog.getFile();
				String filePath = loadFileDialog.getDirectory();
				//当选择取消时,直接结束动作
				if(fileName==null || filePath==null) return;
				area.setText("");
				file = new File(filePath,fileName);
				
				BufferedReader bufr = null;
				//将文件中的信息写到文本区域中
				try {
					bufr = new BufferedReader(new FileReader(file));
					
					String line = null;
					while((line=bufr.readLine())!=null) {
						area.append(line+'\n');
					}
				} catch (IOException e2) {
					throw new RuntimeException("文件打开失败");
				} finally {
					if(bufr!=null)
						try {
							bufr.close();
						} catch (IOException e3) {
							e3.printStackTrace();
						}
				}
			}
		});
		
		//窗体的关闭动作监听
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		
		exit.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
	}
}

jar包双击执行:

1. 通过javac -d命令,可以把一个java文件编译到一个文件夹中。(可以给自己的文件带上包名package)

2. 在javac -d 指定的文件夹下创建一个配置文件信息,名字随意,内容是:

Main-Class:包名.要执行的class文件名

最后要有一个回车,固定格式

3. 通过jar -cvfm jar 包名.jar 配置文件名 包名

4. 生成了可以执行的jar包

你可能感兴趣的:(java,黑马程序员)