(13)JavaGUI图形化界面

JavaGUI图形化界面

GUI(图形用户界面)

概述:

GUI

Graphical User Interface(图形用户接口)

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

CLI

Command Line User Interface(命令行用户接口)

就是常见的Dos命令行操作

需要记忆一些常用的命令,操作不直观

举例:

比如创建文件夹,或者删除文件夹等。

JavaGUI提供的对象都存在java.Awtjavax.Swing两个包中。

AwtSwing

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

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

继承关系图:


布局管理器

在制作图形化界面时,要考虑该按照什么方式布局?

Java当中就给了我们布局管理器

容器中的组件的排放方式,就是布局。

常见的布局管理器:

1, FlowLayout(流式布局管理器)

从左到右的顺序排列

Panel默认的布局管理器

2, BorderLayout(边界布局管理器)

东,南,西,北,中

Frame默认的布局管理器

3GridLayout(网格布局管理器)

规则的矩阵

4CardLayout(卡片布局管理器

选项卡

5GridBagLayout(网格包布局管理器)

非规则的矩阵

GUI-Frame构建窗体

查询AIP文档,在java.awt包中Frame框架创建类,Frame 是带有标题和边框的顶层窗口

1, 创建Frame窗体,

Frame f = new Frame(“my Frame”);//创建一个新的具有指定标题的Frame对象

2,对窗体进行基本设置:对窗体大小,位置布局进行设置

f.setSize(500,400);//对窗体的大小即,长宽进行设置

f.setLocation(300,200);//对窗体所在位置进行横坐标和纵坐标设置

f.setLayout(new FlowLayout());//传入指定布局管理器对象

3,定义组件:

Button b = new Button(“我是一个按钮”);

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

f.add(b);

5,让窗体显示,通过setVisible(true);注意: f.setVisible(boolean b);//通过设置参数是true还是false是否显示窗体

f,setVisible(true);


事件监听机制

组成:

事件源(组件):awt或者swing包中的那些图形界面组件

事件(Event):每一个事件源都有自己特有的对应事件和共性事件

监听器(Listener):将可触发某一时间的动作(不止一个动作),都封装到监听器中

事件处理(引发事后处理方式):引发事后处理方式。

以上三者,在java中都已经定义好了。直接获取对象来用就可以了。

我们要做的是,对产生的动作进行处理。

事件监听机制步骤:

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

2, 通过事件源对象的addXXXListener()方法将监听器注册到改时间源上。

3, 该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象

4, 一般用匿名内部类来标示

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

6, 事件触发后会把事件打包成对象传递给该变量。(其中包括事件源对象,通过getSource()或者,getComponent()

窗口事件

WindowListener用于接收窗口事件的侦听器接口。旨在处理窗口事件的类要么实现此接口(及其包含的所有方法),要么扩展抽象类 WindowAdapter(仅重写所需的方法)。然后使用窗口的 addWindowListener 方法将从该类所创建的侦听器对象向该 Window 注册。当通过打开、关闭、激活或停用、图标化或取消图标化而改变了窗口状态时,将调用该侦听器对象中的相关方法,并将 WindowEvent 传递给该方法。

 void

windowActivated(WindowEvent e) 
          将 Window 设置为活动 Window 时调用。

 void

windowClosed(WindowEvent e) 
          因对窗口调用 dispose 而将其关闭时调用。

 void

windowClosing(WindowEvent e) 
          用户试图从窗口的系统菜单中关闭窗口时调用。

 void

windowDeactivated(WindowEvent e) 
          当 Window 不再是活动 Window 时调用。

 void

windowDeiconified(WindowEvent e) 
          窗口从最小化状态变为正常状态时调用。

 void

windowIconified(WindowEvent e) 
          窗口从正常状态变为最小化状态时调用。

 void

windowOpened(WindowEvent e) 
          窗口首次变为可见时调用。

因为是抽象,所以需要覆盖7个方法,但是只需用到其中某个方法怎么弄呢?

解决:

因为WindowListener的子类WindowAdapter已经实现了WindowListener接口,并覆盖了其中的所以方法,那么我只要继承自WindowAdapter覆盖其中的方法即可

示例

import java.awt.*;
import java.awt.event.*;
class  WindowEventDemo{
	public static void main(String[] args) {
		Frame f = new Frame("我的窗口");
		//f.setSize(500,400);设置窗口大小
		//f.setLocation(300,200);设置窗口的位置
		f.setBounds(300,200,500,400);//将上面两个方法同一设置,移动组件并调整其大小。
		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 windowOpened(WindowEvent e){
				System.out.println("窗口可见");
			}
			public void windowActivated(WindowEvent e){
				System.out.println("窗口前置");
			}
		});

		f.setVisible(true);//让组建显示
	}
}


Ation事件

让按钮具备退出程序的功能

示例:

import java.awt.*;
import java.awt.event.*;
class  ActionEventDemo{
	private Frame f;//定义图界面组件所需引用
	private Button but;
	ActionEventDemo(){
		init();//构造函数初始化窗口的创建和功能实现
	}
	public void init(){
		f = new Frame();
  //基本设置
		f.setBounds(300,200,500,400);
		f.setLayout(new FlowLayout());
		but = new Button("关闭按钮");//创建组件
		myEvent();//加载窗口事件。
		f.add(but);
		f.setVisible(true);
	}
	public void myEvent()
	{
		f.addWindowListener(new WindowAdapter()//窗口监听
		{
			public void windowClosing(WindowEvent e)
			{
				System.out.println("关闭窗口");
				System.exit(0);
			}
		});
/*
让按钮具备退出程序的功能
按钮就是事件源,那么选择什么监听器呢?
通过关闭窗口示例知道,想要知道那个组件具备特有的监听功能,
需要查看该组件对象的功能。
查询Button的描述,发现按钮支持一个特有的监听:addActionListener();
*/
		but.addActionListener(new ActionListener()//按钮监听
		{
			public void actionPerformed(ActionEvent e)
			{
				System.out.println("关闭窗口,是按钮干的!");
				System.exit(0);
			}
		});
	}
	public static void main(String[] args) {
		new ActionEventDemo();//运行窗体程序代码
	}
}


鼠标事件

鼠标监听MonseListener,抽象类,所以有其子类MouseAdapter实现

主要方法

 void

mouseClicked(MouseEvent e) 
          鼠标按键在组件上单击(按下并释放)时调用。

 void

mouseDragged(MouseEvent e) 
          鼠标按键在组件上按下并拖动时调用。

 void

mouseEntered(MouseEvent e) 
          鼠标进入到组件上时调用。

 void

mouseExited(MouseEvent e) 
          鼠标离开组件时调用。

 void

mouseMoved(MouseEvent e) 
          鼠标光标移动到组件上但无按键按下时调用。

 void

mousePressed(MouseEvent e) 
          鼠标按键在组件上按下时调用。

 void

mouseReleased(MouseEvent e) 
          鼠标按钮在组件上释放时调用。

 void

mouseWheelMoved(MouseWheelEvent e) 
          鼠标滚轮旋转时调用。

在具体调用鼠标功能时的监听,

MouseEvent有如点击鼠标次数等特有操作方法

getClickCount()返回与此事件关联的鼠标单击次数。


键盘事件

KeyAdapter:接收键盘事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象。

主要方法

 void

keyPressed(KeyEvent e) 
          按下某个键时调用此方法。

 void

keyReleased(KeyEvent e) 
          释放某个键时调用此方法。

 void

keyTyped(KeyEvent e) 
          键入某个键时调用此方法。

重点:

KeyEvent:标示组件中发生键击的事件

当按下、释放或键入某个键时,组件对象(如文本字段)将生成此低级别事件。

Char getKeyChar();//返回按下键盘关联的字符

Int getKeyCode();//返回键关联在整数

Static String getKeyText(int keycode)//因为在键与某整数想关联即键盘码,通过获取按下某个功能键Esc键会返回一个整数,getText(整数)通过整数返回你按下的是那个键。

组合键:

比如组合ctrlenter关闭窗口,示例:

If(e.isControlDown()&&e.getKeyCode()==KetEvent.VK_ENTER)

解读:先判断ctrl键是否按下,在判断按的键是否是回车键

示例:

<span style="white-space:pre">		</span>//给文本区添加键盘监听
		tf.addKeyListener(new KeyAdapter(){
			public void keyPressed(KeyEvent e){
				int key = e.getKeyCode();
				if(!(key>=KeyEvent.VK_0&&key<=KeyEvent.VK_9)){
					System.out.println("该字符非法");
					e.consume();//当输入的是非法的就不再默认录入。
				}
			}
		});
		//给按钮添加鼠标监听
		but.addMouseListener(new MouseAdapter(){
			public void mouseClicked(MouseEvent e){
				if (e.getClickCount()==2)
					System.out.println("鼠标监听双击关闭");
					//System.exit(0);
			}
			public void Pressed(MouseEvent e){
				System.out.println("鼠标监听单击示例");
			}
		});
		//给按钮添加键盘监听
		but.addKeyListener(new KeyAdapter(){
			public void keyPressed(KeyEvent e){
				//组合键,当ctrl键和某键组合==java中设定的常量值时,就关闭窗口
				if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)
					System.out.println("组合键关闭的");
					//System.exit(0);
				//根据键盘码获取按下的什么键
			//System.out.println(KeyEvent.getKeyText(e.getKeyCode())+""+e.getKeyCode());
				//通过监听Esc来关闭程序。	
				if(e.getKeyCode()==KeyEvent.VK_ESCAPE){
					System.out.println("Esc键关闭的");
					//System.exit(0);
				}
			}
		});


对话框Dialog

概述:

Dialog 是一个带标题和边界的顶层窗口,边界一般用于从用户处获得某种形式的输入。

比如:当我们在文本区输入错误,会有对话框Dialog提示

何时需要产生对话框:

此对象时需要在调用时,才创建对象。如:当在误操作的时候,就需要出现提示错误信息的对话框,此时才创建的这个对象。

/*
练习:列出指定目录内容
当输入路径不对时,弹出对话框提示信息
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class  MyWindowDemo{
	//定义图形界面所需引用
	private Frame f;
	private	Button but;
	private	Button okbut;
	private TextField tf;
	private TextArea ta;
	private Dialog dia;
	private Label lab;
	//构造函数初始化功能组件
	MyWindowDemo(){
		init();
	}
	private void init(){
		f = new Frame("我的窗口");
		but = new Button("转到");
		tf = new TextField(40);
		ta = new TextArea(15,60);

		f.setBounds(300,150,500,350);
		f.setLayout(new FlowLayout());
		
		f.add(tf);
		f.add(but);
		f.add(ta);
		
		myEvent();//事件监听

		f.setVisible(true);
	}
	public void myEvent(){
		//给文本框注册键盘监听
		tf.addKeyListener(new KeyAdapter(){
			public void keyPressed(KeyEvent e){
				//当敲击回车键时程序执行
				if(e.getKeyCode()==KeyEvent.VK_ENTER)
					showDir();
			}
		});
		//给按钮添加活动监听
		but.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){	
				showDir();//当单击按钮调用功能
			}
				
		});
		//添加窗口事件监听
		f.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
	}
	private void showDir()//封装成功能函数{
		String dirpath = tf.getText();//获取文本区的录入的路径
		File dir = new File(dirpath);//将路径封装成文件对象
		if (dir.exists()&&dir.isDirectory())//判断路径是否存在且是否是路径{
			ta.setText("");//先将文本区的数据清空
			String[] names = dir.list();
			for(String name: names){
				ta.append(name+"\r\n");//追加添加进文本框
			}
		}
		else//当输如的不是路径弹出对话框Dialog{
			dia = new Dialog(f,"异常提示",true);
			//对对话框基本设置
			dia.setBounds(500,300,400,150);
			dia.setLayout(new FlowLayout());
			okbut = new Button("确定");//对话框按钮
			lab = new Label();//文本标签
			dia.add(lab);
			dia.add(okbut);

			//对此对话框注册监听
			dia.addWindowListener(new WindowAdapter(){
				public void windowClosing(WindowEvent e){
					dia.setVisible(false);//将对话框隐藏
				}
			});
			//对对话框按钮注册监听
			okbut.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					dia.setVisible(false);//将对话框隐藏
				}
			});
			String info = "您输入的路径:"+dirpath+"有误,请重新输入";
			//把提示信息设置进去
			lab.setText(info);
			dia.setVisible(true);					
			}
		}	
	public static void main(String[] args) {
		new MyWindowDemo();
	}
}程序显示如图:



菜单(Menu

概述说明:

1Menu:菜单,继承MenuItem;有右三角的图标存在,可添加Menu和MenuItem

2MenuBar:菜单栏,可添加菜单和菜单条目。一般先创建菜单栏,再创建菜单。

3MenuItem:菜单条目,也称菜单项,无右三角的图标存在,是最终的菜单项。

4菜单的事件处理和组件一样,可以对类型为MenuItem和Menu的对象这个事件源添加活动监听ActionListener,并进行相关的事件处理。

5通过setMenuBar()方法,将菜单添加到Frame中

/*
菜单示例
*/
import java.awt.*;
import java.awt.event.*;
class MenuDemo{
	private Frame f;
//定义菜单所需引用
	private MenuBar mb;
	private Menu me,me1,me2,me3,me4;
	private MenuItem mi,mi2,mi3,mi4;
//构造函数
	MenuDemo(){
		init();
	}
//窗体实现和基本设置
	private void init(){
		f = new Frame("我的窗口");
		f.setBounds(500,400,400,200);
		f.setLayout(new FlowLayout());
//创建菜单栏
		mb = new MenuBar();
//创建菜单
		me = new Menu("文件");
		me1= new Menu("标准文本");
		me2 = new Menu("编辑");
		me3 = new Menu("工具");
		me4 = new Menu("帮助");
//创建子条目
		mi = new MenuItem("新建");
		mi2 = new MenuItem("打开");
		mi3 = new MenuItem("关闭");
		mi4 = new MenuItem("退出");
//菜单栏添加菜单组件
		mb.add(me);
		mb.add(me2);
		mb.add(me3);
		mb.add(me4);
//菜单添加子菜单
		me.add(me1);
//菜单添加子条目组件
		me1.add(mi);
		me.add(mi2);
		me.add(mi3);
		me.add(mi4);
//添加菜单栏组件
		f.setMenuBar(mb);
//窗体事件
		myEvent();
//窗体显示
		f.setVisible(true);
	}
	private void myEvent(){
		//注册关闭窗口监听
		f.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
		//给退出注册关闭监听
		mi4.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				System.exit(0);
			}
		});
	}
	public static void main(String[] args) {
		new MenuDemo();
	}
}运行结果如图:

练习:打开文件

分析:

打开文件关联到FileDialog,根据里面提供的获取文件路径和文件名的方法,我们可以封装成File对象,对File对象里的内容通过BfferedReader缓冲取出,并添加到指定文本区中。

/*
练习:打开文件,增删修改文件并保存文件
*/
import java.io.*;
import java.awt.*;
import java.awt.event.*;
class  OpenFileDemo
{//定义所需组件
	private Frame f;
	private TextArea area;
	private MenuBar mb;
	private Menu fileM;
	private MenuItem openMI,saveMI,endMI;
	private File file;

	private FileDialog open,save;
//构造函数
	OpenFileDemo(){
		init();
	}
//窗体实现和基本设置
	private void init(){
		f = new Frame("My Wdionw");
		f.setBounds(400,300,500,500);
		area = new TextArea();
//菜单实现和基本设置
		mb = new MenuBar();
		fileM = new Menu("文件");
		openMI = new MenuItem("打开");
		saveMI = new MenuItem("保存");
		endMI = new MenuItem("退出");
//创建一个具有指定标题的文件对话框窗口,用于加载或保存文件。
		open = new FileDialog(f,"打开文件",FileDialog.LOAD);
		save = new FileDialog(f,"保存文件",FileDialog.SAVE);
		mb.add(fileM);菜单栏添加菜单
		fileM.add(openMI);菜单添加子条目
		fileM.add(saveMI);
		fileM.add(endMI);
		f.setMenuBar(mb);窗口添加菜单栏
		f.add(area);添加文本区
		myEvent();//事件监听
		f.setVisible(true);//显示窗体
	}
	private void myEvent(){
		//注册关闭窗口监听
		f.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
		//给endMI注册活动监听
		endMI.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				System.exit(0);
			}
		});
		//给open注册活动监听
		openMI.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				/*想要打开某个文件就需要先知道这个文件的路径,
				在FileDialog类中就有
				getFile():获取此文件对话框的选定文件。
				getDirectory():获取此文件对话框的目录。*/
				open.setVisible(true);
				String path = open.getDirectory();
				String name = open.getFile();
				//判断路径文件名是否为null
				if(path==null || name==null)
					return;
				area.setText("");//将之前文本区的数据清空
				file = new File(path,name);
				try{
					BufferedReader buf = new BufferedReader(new FileReader(file));
					String line = null;
					while ((line = buf.readLine())!=null){
						area.append(line+"\r\n");//读一个就往文本区写一个
					}
					buf.close();
				}
				catch (Exception e1){
					 throw new RuntimeException("文件打开失败");
				}

			}
		});
//注册save活动监听
		saveMI.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				if (file == null){//判断文件有没有被保存过时
					save.setVisible(true);
					String path = save.getDirectory();
					String name = save.getFile();
					file = new File(path,name);
				}
			try{//通过文本区获取将新修改过的文本数据,将之传入缓冲区,并刷新保存
					BufferedWriter buw = 
						new BufferedWriter(new FileWriter(file));
					String text = area.getText();
					buw.write(text);
					buw.close();
				}
				catch (IOException ee){
					throw new RuntimeException("保存异常");
				}
			}
		});
	}
	public static void main(String[] args) {
		new OpenFileDemo();//主函数调用程序。
	}
}


GUIjar包双击执行)

在图形界面化后,理所当然也需要通过图形来开始执行程序,而不是通过控制台。

那怎么做呢?

这就需要将程序的class文件打成jar包,就可以双击执行了。

步骤:

1, 首先在java文件中导入一个包,没有则需要创建一个包,如package mamenu

2, 生成包:通过控制台:javac –d c:\myclass OpenFileDemo.java回车,则会在cmyclass文件夹下生成所有的.Class文件

3, 在此目录下再新建一个文件,为jar包配置清单属性信息。如1.txt或者其他名称其他扩展名的文件都可以,然后再其中编辑固定格式为:Main-Class:(空格)包名.类名(回车)

Main-Class: mymenu.OpenFileDemo

4, 控制台编译:jar –cvfm my.jar 1.txt mymenu。若想添加其他信息,则直接编译jar即可得出相应的命令。

5, 双击执行jar包。

注意:

有些问题可能导致jar包双击不能执行

如在为jar包配置清单属性信息时:

1, 如果无空格:在编译的时候,就会报IO异常,提示无效的头字段,即invalidheader field。这说明1.txt在被IO流读取。

2如果无回车:在列表清单.MF中不会加入相应的加载主类的信息,也就是说配置清单的属性主类名称不会加载进清单中,也就不会执行

说明:

Jar文件必须在系统中注册了才能运行

Xp系统的注册方法:

1.打开任意对话框,在菜单栏点击工具按钮,选择文件夹选项

2.选择新建--->扩展名,将扩展名设置为jar,确定

3.选择高级,可更改图标,然后点击新建,命名为open,

4.在用于可执行应用程序中,点浏览,将jdk下的bin的整个文件路径添加进来,并在路径后添加-jar即可。

Window7注册方法:

1, 改变打开方式,右击jar文件点击属性,选择打开方式更改,找到jdk安装包bin目录下javaw.exe选择它为打开方式

2, 彻底方法修改注册表:打开doc命令行,输入regedit,弹出注册表对话框,进入HKEY_CLASSES_ROOT\Applications\javaw.exe\shell\open\command,修改默认的键值为 "D:\Program Files\Java\jre\bin\javaw.exe" -jar "%1" 。

如图:



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值