黑马程序员java基础之GUI

本文详细介绍Java GUI编程的基础知识,包括如何创建图形界面、事件监听机制,以及菜单栏的制作等。通过具体实例展示了按钮操作、文件打开保存等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

GUI即时图形化界面图形化界面方便较命令行模式更加简单明了,易于操作。图形化界面提供的队形都在java.awt和javax.Swing中。Awt相对比较依赖于平台。

1.创建图形化界面的步骤:

1.创建Frame窗体

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

3.定义组件

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

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

import java.awt.*;
class AwtDemo
{
	public static void main(String[] args)
	{
		Frame f=new Frame("my awt");//创建窗体
		//会默认边界式布局,并且全部居中填充
		f.setSize(500,400);//设置窗体的大小
		f.setLocation(300,200); //设置窗体的位置
		f.setLayout(new FlowLayout()); //设置布局管理
		Button b=new Button("我是一个按钮");//创建按钮

		f.add(b);
		f.setVisible(true);

		System.out.println("Hello word");
	}
}

2.事件监听机制

特点:事件源,事件,监听器,事件处理,这些都已经在java中定义好了,直接获取对象就可以了

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

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

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

import java.awt.*;
import java.awt.event.*;
class AwtDemo
{
	public static void main(String[] args)
	{
		Frame f=new Frame("my awt");//创建窗体
		//会默认边界式布局,并且全部居中填充
		f.setSize(500,400);//设置窗体的大小
		f.setLocation(300,200); //设置窗体的位置
		f.setLayout(new FlowLayout()); //设置布局管理
		Button b=new Button("我是一个按钮");//创建按钮

		f.add(b);

		f.addWindowListener(new WindowAdapter(){
				public void windowClosing(WindowEvent e)//复写WindowListener的关闭方法
				{
					System.out.println("我被关了啦"+e.toString());
					System.exit(0);
				}
				public void windowActivated(WindowEvent e)
				{
					System.out.println("我活了");//被前置
				}
				public void windowOpened(WindowEvent e)
				{
					System.out.println("我被打开了");
				}
			}
		);  //创建一个匿名内部类,此类是WindowListener的子类

		f.setVisible(true);  //通过ture值,使frame窗口可见
	}
}
然后实现按钮的关闭功能

import java.awt.*;
import java.awt.event.*;

class FrameDemo
{
	private Frame f;//声明私有成员变量窗体
	private Button but;//声明私有成员变量按钮
	FrameDemo()//构造函数
	{
		init();
	}
	public void init()
	{
		f=new Frame();   //创建窗体对象
		//对窗体进行基本设置
		f.setBounds(300,100,600,500);//坐标值和宽高
		f.setLayout(new FlowLayout());//单独指定布局管理器,避免整个填充
		
		but=new Button("my button");//创建按钮

		f.add(but);//添加组件到窗体里
		
		myEvent();  //加载窗体上的事件
		
		f.setVisible(true);//显示窗体
	}
	public void myEvent()//将监听器单独封装成方法
	{
		f.addWindowListener(new WindowAdapter()    //将监听器添加到窗体中,并引用匿名内部类,实例化监听器的各种方法
			{
				public void windowClosing(WindowEvent e)
				{
					System.exit(0);
				}
			});

		//让按钮具备退出功能

		but.addActionListener(new ActionListener()    
			//调用匿名内部类,复写按钮监听器中的actionPerformed方法,执行退出操作
			{
				public void actionPerformed(ActionEvent e)
				{
					System.out.println("退出,按钮执行");
					System.exit(0);
				}
			});
	}
	public static void main(String[] args)
	{
		new FrameDemo();
	}
	
}

鼠标和键盘事件:
import java.awt.*;
import java.awt.event.*;

class MouseAndKeyEvent
{
	private Frame f;	//声明私有成员变量窗体
	private Button but;	//声明私有成员变量按钮
	private TextField tf;	//声名变量文本框

	MouseAndKeyEvent()  	//构造函数
	{
		init();
	}
	public void init()
	{
		f=new Frame();   //创建窗体对象
		//对窗体进行基本设置
		f.setBounds(300,100,600,500);	//坐标值和宽高
		f.setLayout(new FlowLayout());	//单独指定布局管理器,避免整个填充
		
		tf=new TextField(20);	//创建文本框,10是添加的列数

		but=new Button("my button");	//创建按钮

		f.add(but);	//添加组件到窗体里
		
		f.add(tf);	//添加文本框到窗体中

		myEvent();  	//加载窗体上的事件
		
		f.setVisible(true);	//显示窗体
	}
	private void myEvent()		//将监听器单独封装成方法
	{
		f.addWindowListener(new WindowAdapter()    //将监听器添加到窗体中,并引用匿名内部类,实例化监听器的各种方法
			{
				public void windowClosing(WindowEvent e)
				{
					System.exit(0);
				}
			});

		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(code+"--是非法的");
					e.consume();	//使用此事件,将会不再按照默认的方式处理。
							//在这里,原本输入除了数字之外的字符也都会进入文本框,
							//采用这个事件之后,除数字之外的字符不再进入文本框
				}	
			}
		});

		but.addActionListener(new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					System.out.println("action ok");
				}
			});	//发现鼠标点击会先于按钮活动按钮

		but.addMouseListener(new MouseAdapter()			//给button添加鼠标监听   
 
			//调用匿名内部类,复写按钮监听器中的mouseEntered方法,实现鼠标进入事件
			{
				private int count=1;	//定义一个计数器
				private int ck=1;
				public void mouseEntered(MouseEvent e)
				{
						
					System.out.println("鼠标进入到该组件"+count++);	
				}
				public void mouseClicked(MouseEvent e)
				{
					if(e.getClickCount()==2)	//鼠标双击动作
						System.out.println("双击动作"+ck++);
				}
			});

		but.addKeyListener(new KeyAdapter()	//给按钮添加键盘监听
			{
				public void keyPressed(KeyEvent e)
				{
					/*
					if(e.getKeyCode()==KeyEvent.VK_ENTER)	//如果按到enter键是退出
						System.exit(0);
					*/

					//组合键操作
					if(e.isControlDown() && e.getKeyCode()==KeyEvent.VK_ENTER)
						System.out.println("ctrl+enter 是运行了");
					//获取键盘码和对应的键名
					//System.out.println(KeyEvent.getKeyText(e.getKeyCode())+"--"+e.getKeyCode());	
				}
			});
	}
	public static void main(String[] args)
	{
		new MouseAndKeyEvent();
	}
}

练习:列出指定目录内容

import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyWindowDemo
{
	private Frame f;
	private TextField tf;
	private Button but;
	private TextArea ta;
	private Dialog d;	//引用一个对话框成员变量
	private Label lab;	//引用一个标签
	private Button okbu;	//引用按钮变量,应用于对话框中
	MyWindowDemo()
	{
		init();
	}
	public void init()
	{
		f=new Frame("my window");	//创建一个窗体
		f.setBounds(300,100,600,400);	//设置窗体的位置,宽高
		
		f.setLayout(new FlowLayout());	//设置成流布局

		tf=new TextField(30);	//新建文本框,设置列数是30
		
		but=new Button("转到");	//新建按钮
		ta=new TextArea(10,40);	//新建文本编辑区域,15行40列

		d=new Dialog(f,"提示信息-self",true);	//新建一个对话框,true值表示当前窗口不处理就无法处理后置窗口
		d.setBounds(400,200,200,150);		//设置对话框的位置和宽高
		d.setLayout(new FlowLayout());		//设置对话框布局为流式布局

		lab=new Label();			//创建标签
		okbu=new Button("确定");		//创建对话框中的按钮

		d.add(lab);
		d.add(okbu);

		f.add(tf);
		f.add(but);
		f.add(ta);

		myEvent();	
		f.setVisible(true);	//设置窗口可视
	}
	private void myEvent()
	{
		okbu.addActionListener(new ActionListener()	//操作时调用
			{
				public void actionPerformed(ActionEvent e)
				{
					d.setVisible(false);	//点击对话框的确认按钮事件就会不显示对话框了
				}
			});
		d.addWindowListener(new WindowAdapter()	//添加窗体关闭方法,复写关闭方法
			{
				public void windowClosing(WindowEvent e)
				{
					d.setVisible(false);	//点击对话框关闭按钮的时候就不显示对话框了
				}
			});
		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		//如果目录不存在的处理方式
		{
			String info="您输入的路径"+dirPath+"不存在";
			lab.setText(info);
			d.setVisible(true);	//如果目录不存在,就显示对话框
		}
						

		//tf.setText("");	//将搜素的内容转到文本区域后,清空文本框
	}

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




菜单栏的制作,简单的制作出菜单栏及一些菜单

import java.awt.*;
import java.awt.event.*;

class MyMenuDemo
{
	private Frame f;	//引用窗体变量
	private MenuBar mb;	//引用菜单条变量
	private Menu m;		//引用菜单变量
	private MenuItem closeItem,openItem,salveItem;	//引用菜单项

	MyMenuDemo()		//构造函数初始化
	{
		init();
	}
	public void init()
	{
		f=new Frame("my window");	//初始化窗口
		f.setBounds(300,100,500,600);	//设置窗口的位置和宽高
		f.setLayout(new FlowLayout());	//设置窗体的布局方式为流式布局

		mb=new MenuBar();		//初始化菜单栏
		m=new Menu("文件");		//初始化菜单

		closeItem=new MenuItem("退出");	//初始化菜单项目
		openItem=new MenuItem("打开");
		salveItem=new MenuItem("保存");
		
		mb.add(m);		//将菜单添加到菜单栏中

		m.add(openItem);
		m.add(salveItem);
		m.add(closeItem);		//将关闭按钮添加到菜单中


		f.setMenuBar(mb);	//将菜单栏设置到窗体中

		myEvent();
		
		f.setVisible(true);
	}

	private void myEvent()
	{
		closeItem.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 MyMenuDemo();
	} 
}

然后具体实例化菜单中的打开和保存操作

import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyMenuTest
{
	private Frame f;	//引用窗体变量
	private MenuBar bar;	//引用菜单条变量

	private TextArea ta;
	private Menu fileMenu;		//引用菜单变量
	private MenuItem closeItem,openItem,saveItem;	//引用菜单项

	private FileDialog openDia,saveDia;		//引用打开和保存对话框

	private File file;		//引用文件变量
	MyMenuTest()		//构造函数初始化
	{
		init();
	}
	public void init()
	{
		f=new Frame("my window");	//初始化窗口
		f.setBounds(300,100,500,600);	//设置窗口的位置和宽高
		// f.setLayout(new FlowLayout());	//设置窗体的布局方式为流式布局

		bar=new MenuBar();		//初始化菜单栏

		ta=new TextArea();

		fileMenu=new Menu("文件");		//初始化菜单

		closeItem=new MenuItem("退出");	//初始化菜单项目
		openItem=new MenuItem("打开");
		saveItem=new MenuItem("保存");
		
		bar.add(fileMenu);		//将菜单添加到菜单栏中

		fileMenu.add(openItem);
		fileMenu.add(saveItem);
		fileMenu.add(closeItem);		//将关闭按钮添加到菜单中


		f.setMenuBar(bar);	//将菜单栏设置到窗体中
		
		openDia=new FileDialog(f,"打开了",FileDialog.LOAD);	//初始化
		saveDia=new FileDialog(f,"开始保存",FileDialog.SAVE);
		myEvent();
		f.add(ta);
		f.setVisible(true);
	}

	private void myEvent()
	{
		saveItem.addActionListener(new ActionListener()		//保存事件处理
			{
				public void actionPerformed(ActionEvent e)
				{
					if(file==null)		//判断文件是否存在,如果不存在,则创建一个
					{
						saveDia.setVisible(true);	//显示保存对话框
						String dirPath=saveDia.getDirectory();	//获取目录地址
						String fileName=saveDia.getFile();	//获取文件名
						if(dirPath==null || fileName==null)
							return;
						file=new File(dirPath,fileName);	//封装成对象

					}
					try
					{
						BufferedWriter bufw=new BufferedWriter(new FileWriter(file));	//创建文件写入流缓冲区,将文件传入流中
						String text=ta.getText();	//获取文本区内容
						bufw.write(text);		//将文本框内容写出去
						bufw.close();		//关闭流
					}
					catch(IOException ioe)
					{
						throw new RuntimeException("写入失败");
					}
				}
			});
		openItem.addActionListener(new ActionListener()		//创建打开事件监听机制
			{
				public void actionPerformed(ActionEvent e)
				{	
					openDia.setVisible(true);	//显示对话框
					String dirPath=openDia.getDirectory();	//获取文件路径
					String fileName=openDia.getFile();	//获取文件名
					System.out.println(dirPath+"--"+fileName);

					if(dirPath==null || fileName==null)	//判断是否为空
						return;
					ta.setText("");		//打开新文件之前,清空之前的内容
					file=new File(dirPath,fileName);	//将文件路径和文件名封装成对象
					
					try
					{
						BufferedReader bufr=new BufferedReader(new FileReader(file));	
						//创建读取流缓冲区,将file文件传入
						String line=null;
						while((line=bufr.readLine())!=null)	//开始读取数据
						{
							ta.append(line+"\r\n");		//添加到文本区中
						}
						bufr.close();
					}
					catch(IOException ioe)
					{
						throw new RuntimeException("读取失败");
					}
				}
			});
		closeItem.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 MyMenuTest();
	} 
}
将打开的文件传到文本区中 在文本区写些数据,保存到桌面
          

练习:上述文件保存管理操作前提还是在DOS命令行下操作。接下来创建只用双击就可以执行的jar包

先在代码段中用包将其封装,javac  -d  .java  将相关的类都打包,装到一个文件夹中。然后返回包所在的目录,执行以下命令






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值