Java基础:GUI

第一部分、概述

一、GUI

Graphical User Interface(图形用户接口)

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

二、CLI

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

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

三、Awt与Swing

Java为GUI提供的对象都在java.Awt与java.swing包中。

1、java.awt

        Abstract Window Toolkit(抽象窗口工具包),需要调用本地系统方法来实现功能。属于重量级控件。依赖系统,跨平台性差。

2、javax.swing

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

3、swt界面

        eclipse使用的是swt界面,该外观包基于java.awt,是IBM的eclipse小组独立编写的图形化界面外观包。

四、继承关系流程图


注意:

Container(容器)是一个特殊的组件,该组件可以通过Add方法添加其他组件。

五、布局管理器

1、概念

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

2、常见的布局管理器

FlowLayout(流式布局,从左到右,Panel默认的布局)

BorderLayout(边界布局,东西南北中,未指定边界时,以最大面积填充,Frame默认布局)

GridLayout(网格布局,规则的矩阵)

GardLayout(卡片式布局,选项卡)

GridBagLayout(网格包式布局,非规则的矩阵)

图解:


注意:

1、当一个界面需要多种布局方式时,需要添加面板,在面板中设定不同的布局方式。

2、布局方式远不止以上几种,还有其他的未介绍。

六、创建图形化界面

1、基础方法

Frame类中:

Frame(String title)        构造一个新的最初不可见的,具有指定标题的Frame对象

void setMenuBar(MenuBar mb)        将此窗体的菜单栏设置为指定的菜单栏

Container类中:

void setLayout(LayoutManager mgr)        设置此容器的布局管理器

Component add(Component comp)        将指定组件追加到此容器的尾部 

Component类中:

void setVisible(boolean b)        根据参数b的值显示或隐藏组件

void setLocation(int x,int y)        组件创建时在桌面的显示位置(横坐标、纵坐标)

void setSize(int width,int height)        设置组件的宽与高(横坐标、纵坐标)

void setBounds(int x, int y, int width, int height)        移动组件并调整其大小

2、基本步骤

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

示例代码:

package demo;
import java.awt.*;
/*
 * 需求:创建图形化界面
 */
public class MyWindowDemo
{
	public static void main(String[] args)
	{
		//1、创建Frame窗体
		Frame f = new Frame("小小窗口");
	
		//2、对窗体进行基本设置
		f.setBounds(100,100,300,200);
		f.setLayout(new FlowLayout());

		//3、定义组件
		Button b = new Button("小按钮");
		
		//4、将组件添加到窗体中
		f.add(b);

		//5、设置窗体显示
		f.setVisible(true);
	}
}

运行结果:


注意:

创建图形化界面会开启一个新的线程。


第二部分、事件监听机制

一、概述

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

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

监听器(Listener):将可以触发某一个事件的动作都已经封装到了监听器中

事件处理(引发事件后处理方式):程序员定义


 事件源、事件、监听器在Java中都已经定义好了,直接获取其对象来用就可以了,程序员需要对产生的动作进行处理。

二、事件监听机制流程图


三、事件处理方式

事件包:java.awt.event(包括监听器、适配器及事件)

Window类中:

void addWindowListener(WindowListener l)        添加指定的窗口侦听器,以从此窗口接收窗口事件

WindowListener(接口,窗体监听,有适配器)常用方法:

void windowActivated(WindowEvent e)        将 Window 设置为活动(前置) Window 时调用
void windowClosing(WindowEvent e)        用户试图从窗口的系统菜单中关闭窗口时调用
void windowOpened(WindowEvent e)        窗口打开时调用(WindowEvent 窗体事件)


        由于WindowListener接口中有7个方法,创建子类对象则需要覆盖所有的方法。为了方便操作,Java为其提供了适配器:abstract WindowAdapt,其覆盖了监听器中所有的方法,只是没有方法体。因此只要定义类继承WindowAdapt就可以监听指定的动作了。

        一般当监听器方法超过3个(包括3个)就有适配器Adapt;添加事件监听器时一般采用匿名内部类的方式创建子类对象。

        通过窗体的实例了解到,想要知道哪个组件具备什么样的特有监听器,需要查看该组件对象的功能(组件有哪些时间只有组件自己知道)。


Button类中:

void addActionListener(ActionListener l)        添加指定的动作侦听器,以接收发自此按钮的动作事件

ActionListener(接口,活动监听,无适配器)

void actionPerformed(ActionEvent e)    发生操作时调用


该监听器没有适配器,因其只有一个方法。活动监听键盘和鼠标都可以让其活动,因此,按钮尽量添加活动监听。

四、共性事件

鼠标事件与键盘事件几乎所有的组件都具备,因此存在于Component中:

void addKeyListener(KeyListener l)        添加指定的按键侦听器,以接收发自此组件的按键事件
void addMouseListener(MouseListener l)        添加指定的鼠标侦听器,以接收发自此组件的鼠标事件


MouseListener(接口,鼠标监听,有适配器)

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

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

MouseEvent(鼠标事件)

int getClickCount()       返回与此事件关联的鼠标单击次数 (==2为双击)


KeyListener (接口,键盘监听,有适配器)

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

KeyEvent(键盘事件)

char getKeyChar()        返回与此事件中的键关联的字符
int getKeyCode()        返回与此事件中的键关联的整数 keyCode

static int VK_R       R 键对应的值
static int VK_ENTER        Enter键对应的值

例:

if(code>KeyEvent.VK_0 && code<=KeyEvent.VK_9)(判断是否为0-9)

InputEvent(输入事件,鼠标事件与键盘事件的父类)

void consume()        使用此事件,以便不会按照默认的方式由产生此事件的源代码来处理此事件 
boolean isAltDown()        返回 Alt 修饰符在此事件上是否为 down
boolean isControlDown()        返回 Control 修饰符在此事件上是为 down
boolean isShiftDown()        返回 Shift 修饰符在此事件上是否为 down

示例代码:

package demo;
/*
	需求:演示事件监听机制并将将监听的事件从图形化界面中分离出来
*/
import java.awt.*;
import java.awt.event.*;
public class AwtTest
{
	//外部建立引用,使其在整个类中都有效
	private Frame  f;
	private Button b;

	AwtTest()
	{
		//对象一初始化就具备图形化界面及相应事件
		this.init();
	}
	
	//对图形化界面初始化
	public void init()
	{
		f = new Frame("my frame");
		b = new Button("my button");
		f.setBounds(200,200,500,400);
		
		f.setLayout(new FlowLayout());//定义窗体的布局方式 ---- 流式布局

		f.add(b);//将组件添加进窗口中

		myEvent();//添加事件监听机制

		f.setVisible(true);//设置显示窗体
	}

	public void myEvent()//将监听事件从图形化界面中分离出来
	{
		f.addWindowListener(new WindowAdapter()//添加一个窗口监听器(匿名内部类的方式)
		{
			public void windowClosing(WindowEvent e)
			{
				System.out.println("窗口关闭!--- 来自窗口监听器");
				System.exit(0);//退出虚拟机
			}
		});

		//该按钮添加活动监听
		b.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				System.out.println("窗口关闭! --  来自按钮");
				System.exit(0);
			}
		});
	}
    //主函数
	public static void main(String[] args) 
	{
		new AwtTest();
	}
}

第三部分:组件

一、文本组件(TextComponent)

1、TextField(文本框)

文本框只有一行。

TextField()        构造新文本字段。 

TextField(int columns)        构造具有指定列数的新空文本字段

void setText(String t)        将此文本组件显示的文本设置为指定文本 

2、TextArea(文本区域)

TextArea()        构造一个将空字符串作为文本的新文本区

TextArea(int rows, int columns) 
          构造一个新文本区,该文本区具有指定的行数和列数,并将空字符串作为文本
void append(String str)        将给定文本添加到当前文本的末尾处(不覆盖)

3、TextComponent中常用方法

void setText(String t)        将此文本组件显示的文本设置为指定文本(会覆盖之前文本)
String getText()        返回此文本组件表示的文本 

二、对话框(Dialog)

1、基本使用

对话框的使用与Frame类型,只是其添加文本时需要用到Lable(标签),然后将标签通过add方法添加到对话框中即可。

Dialog(Frame owner, String title, boolean modal) 
          构造一个最初不可见的 Dialog,它带有指定的所有者 Frame、标题和模式。modal为true时在对话框隐藏前无法操作与其关联的Frame对象。可以通过setVisible(true)方法设置让其显示。

2、标签(Lable)

Label()        构造一个空标签

Label(String text)       使用指定的文本字符串构造一个新的标签,其文本对齐方式为左对齐

void setText(String text)        将此标签的文本设置为指定的文本 
String getText()        获取此标签的文本 

示例代码:

package demo;
/*
 * 通过图形化界面列出指定目录下的文件及文件夹
 */
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class MyWindow
{
	//外部建立引用
	private Frame f;
	private Button b;
	private TextField tf;//
	private TextArea ta;

	MyWindow()
	{
		//对象初始化就具备图形化界面
		init();
	}

	public void init()
	{
		f = new Frame("文件列表");
		b = new Button("转到");
		
		tf = new TextField(49);//创建一个文本框
		ta = new TextArea(20,56);//创建一个文本区域 --- 行与列

		//对窗体进行基本设置
		f.setBounds(200,200,450,400);
		f.setLayout(new FlowLayout());//布局

		f.add(tf);
		f.add(b);
		f.add(ta);
		//添加事件
		myEvent();

		f.setVisible(true);
	}

	public void myEvent()
	{
		//在按钮事件源上添加活动监听
		b.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				method();
			}
		});

		//在文本框事件源上添加键盘监听
		tf.addKeyListener(new KeyAdapter()
		{
			//按下Enter键,运行method方法
			public void keyPressed(KeyEvent e)
			{
				if(e.getKeyCode()==KeyEvent.VK_ENTER)
					method();
			}
		});

		//在Frame窗体上添加窗体监听
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
	}

	public void method()
	{
		//每次对按钮进行操作前,都将文本区域清空
		ta.setText("");
		//获取文本框中输入的字符串(路径)
		String s = tf.getText();
		//将文本框中的内容封装成File对象
		File fi = new File(s);
		
		//若此File对象不是目录
		if(!fi.isDirectory())
		{
			//新建对话框属于f窗体,名称为 错误,模式为true(对话框消失前不可以操作Frame对象)
			Dialog dl = new Dialog(f,"错误",true);
		
			//对对话框进行基本设置
			dl.setBounds(320,330,240,100);
			//给对话框添加按钮(Dialog是Container的子类)
			Button but = new Button("确认");

			dl.setLayout(new FlowLayout());
			//给对话框添加标签
			Label lb = new Label("路径输入错误,请检查后输入!!!");

			dl.add(lb);
			dl.add(but);

			//给对话框中的按钮添加活动监听
			but.addActionListener(new ActionListener()
			{
				//关闭对话框(设置显示:false)
				public void actionPerformed(ActionEvent e)
				{
					dl.setVisible(false);
				}
			});

			//给对话框添加窗体监听
			dl.addWindowListener(new WindowAdapter()
			{
				public void windowClosing(WindowEvent e)
				{
					dl.setVisible(false);
				}
			});

			//给对话框添加键盘监听
			but.addKeyListener(new KeyAdapter()
			{
				public void keyPressed(KeyEvent e)
				{
					if(e.getKeyCode()==KeyEvent.VK_ENTER)
						dl.setVisible(false);
				}
			});

			dl.setVisible(true);//设置显示的要放在最后一行
		}
		//是目录
		else
		{
			//列出目录下的文件
			String[] strs = fi.list(); 
			for(String name:strs)
			{
				ta.append(name+"\r\n");//添加到文本区域中  且要换行
			}
		}
	}
    //主函数
	public static void main(String[] args) 
	{
		new MyWindow();
	}
}
运行结果:
 


三、菜单(Menu)

1、MenuBar(菜单栏)

        MenuBar 类封装绑定到框架的菜单栏的平台概念。为了将该菜单栏与 Frame 对象关联,可以调用该框架的 setMenuBar 方法,即:

Frame类中:

void setMenuBar(MenuBar mb)        将此窗体的菜单栏设置为指定的菜单栏 

MenuBar类中:

MenuBar()        创建新的菜单栏

Menu add(Menu m)        将指定的菜单添加到菜单栏

2、MenuItem(菜单中的最终项)与Menu(菜单)

|--- MenuItem

|--- Menu

Menu类中:

Menu()        构造具有空标签的新菜单

Menu(String label)        构造具有指定标签的新菜单

Menu(String label, boolean tearOff)        构造具有指定标签的新菜单,指示该菜单是否可以分离 


MenuItem add(MenuItem mi)        将指定的菜单项添加到此菜单 

void add(String label)        将带有指定标签的项添加到此菜单 

MenuItem类中:

MenuItem()        构造具有空标签且没有键盘快捷方式的新菜单项。 
MenuItem(String label)        构造具有指定的标签且没有键盘快捷方式的新菜单项

void addActionListener(ActionListener l)        添加指定的动作侦听器,以从此菜单项接收动作事件 

四、文件对话框(FileDialog)

1、概述

FileDialog extends Dialog,其设置方法与Dialog类似,当需要显示时,setVisible(true)

2、方法

构造方法:

FileDialog(Frame parent, String title, int mode)

          创建一个具有指定标题的文件对话框窗口,用于加载或保存文件(属于parent框架)

mode:

static int LOAD        此常量值指示文件对话框窗口的作用是查找要读取的文件 

static int SAVE        此常量值指示文件对话框窗口的作用是查找要写入的文件

方法:

String getDirectory()        获取此文件对话框的目录
String getFile()        获取此文件对话框的选定文件 

五、综合示例

/*
	需求:创建图形化界面打开文本文件。并将文本框修改后的数据保存
*/
package demo;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class MyWindow
{
	//创建引用
	private Frame f;
	private MenuBar mb;
	private Menu m;
	private MenuItem mi,m1,m2; 
	private FileDialog fd,fs;

	private File file;

	private TextArea ta;
	MyWindow()
	{
		init();
	}

	public void init()
	{
		//创建对象
		f = new Frame("程序");
		
		//文本区域,未设置大小,因为Frame默认为边界式布局,未指定边界,最大面积填充
		ta = new TextArea();
		f.setBounds(200,200,600,500);

		//菜单栏与菜单
		mb = new MenuBar();
		m = new Menu("文件");
		mi = new MenuItem("退出");
		m1 = new MenuItem("打开");
		m2 = new MenuItem("保存");

		mb.add(m);
		m.add(m1);
		m.add(m2);
		m.add(mi);
		
		//文件打开对话框
		fd = new FileDialog(f,"OPEN -- 打开文件",FileDialog.LOAD);
		fd.setLocation(300,400);
		
		//文件保存对话框
		fs = new FileDialog(f,"SAVE -- 保存",FileDialog.SAVE);//创建保存对话框并与 框架关联
		fs.setLocation(300,400);

		f.setMenuBar(mb);
		f.add(ta);

		//添加事件
		myEvent();


		f.setVisible(true);
	}

	public void myEvent()
	{
		//保存菜单项添加活动监听(保存对话框显示需要条件)
		m2.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				/*(打开一个文件并修改后点保存不弹出)
				在第一次往文本框写完数据点保存的时候,此时是没有目录和文件名的-----弹出
				而在保存完毕后如果继续在文本框中写入数据,此时目录和文件名都已经存在,不弹出
				 */
				if(file==null)//只有当路径不存在的时候才弹出对话框
				{
					//文件保存对话框显示,并获取对话框中的当前目录与选定文件名
					fs.setVisible(true);
					String f = fs.getFile();
					String dir = fs.getDirectory();
					
					//未选择则返回null,避免发生空指针异常
					if(f==null||dir==null)
						return ;

					file = new File(dir,f);
				}

				try//将对话框中的数据写入文件中
				{
					BufferedWriter bufw = new BufferedWriter(new FileWriter(file));
					//获取文本区域中的数据
					String text = ta.getText();
					bufw.write(text);
					bufw.flush();
					bufw.close();
				}
				catch (IOException e1)
				{
					throw new RuntimeException("保存文件错误");
				}
			}
		});

		//打开菜单项添加活动监听
		m1.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				//显示打开文件对话框,并清空文本区域
				fd.setVisible(true);
				ta.setText("");
				try
				{
					String f = fd.getFile();
					String dir = fd.getDirectory();
					
					//未选中文件避免发生空指针异常
					if(f==null||dir==null)
						return ;

					//将选定文件中的数据写到文本区域中
					file = new File(dir,f);

					BufferedReader bufr = new BufferedReader(new FileReader(file));

					String line = null;
					while((line=bufr.readLine())!=null)
					{
						//文本组件的添加方法
						ta.append(line+"\r\n");
					}
				}
				catch (IOException e1)
				{
					throw new RuntimeException("读取文件错误");
				}
			}
		});

		//退出菜单项添加活动监听
		mi.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				System.exit(0);
			}
		});

		//添加窗体监听
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
	}

	public static void main(String[] args) 
	{
		new MyWindow();
	}
}
运行结果:



第六部分:jar包双击执行

一、实现步骤

1、将类文件打包(Package)。

2、编译.java文件,生成一个文件夹(包),包中有类文件。

3、添加清单字段(jar包中主函数的类)至jar包中的配置信息中,告知主函数所在的类。配置信息格式如下:


注意:”:“后面有一个空格,类名结尾有一个Enter键。

4、采用jar打包工具将文件夹打包,DOS命令行格式如下:

jar -cvfm my.jar 1.txt demo

 -c  创建新档案
 -v  在标准输出中生成详细输出
 -f  指定档案文件名
 -m  包含指定清单文件中的清单信息

 my.jar	生成的jar文件名
 1.txt	配置信息文件名
 demo	类文件包名

jar文件:


jar包中的配置信息文件:

二、注意

1、jar包的运行程序(javaw.exe)


2、为避免出现无法创建虚拟机的情况,需要修改系统中的注册表。

开始→运行→regedit→HKEY_CLASSES_ROOT→Applications→javaw.exe→shell→open→command

将字符串的数值修改为: ”路径“ -jar "1%"(注意-jar前后的空格)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值