黑马程序员——GUI 图形用户界面

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

     GUI图形用户界面,全称Graphical User Interface ,是指用图形的方式,显示计算机操作界面。与GUI相对的是CLI,即command line User Interface 命令行用户接口,常见的是dos命令行操作,需要记忆一些常用的命令,操作不直观。与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。然而这界面若要通过在显示屏的特定位置,以”各种美观而不单调的视觉消息“提示用户”状态的改变“,势必得比简单的消息呈现花上更多的计算能力。JAVA为GUI提供的对象都存在java.Awt 和javax.Swing两个包中。

     布局管理器:
  容器中的组件的排放方式,就是布局,常见的布局管理器有:
FlowLayout 流式布局管理器,从左到右的顺序排列,Panel默认的布局管理器;
BorderLayout 边界布局管理器,东,南,西,北,中,Frame默认的布局管理器;
GridLayout 网格布局管理器 ,规则的矩阵;
CardLayout 卡片布局管理器 选项卡;
GridBagLayout 网格包布局管理器  非规则的矩阵

  Java中创建图形化界面分为以下几步:
1.创建frame窗体;
2.duang窗体进行几本设置,比如大小,位置,布局;
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);
		  
	}
}

   创建完图形界面,想要让界面具有一定的功能,需要给事件添加监听机制,事件监听机制的特点:
1.事件源(组件)    2.事件(Event)    3.监听器(Listener)      4.事件处理(引发时间后处理方式)
事件源:就是awt包或者swing包中的图形界面组件
事件:每一个事件源都有自己特有的对应事件和共性事件
监听器:将可以触发摸一个事件的动作(不只一个动作 )都已经封装到了监听器中,
以上三者,在java中都已经定义好了,直接获取其对象用就可以,我们要做的事情是对产生的动作处理。

以下是给按钮添加退出功能的演示:

/*
Action事件*/
import java.awt.*;
import java.awt.event.*;
class  FrameDemo
{
	//定义该图形中所需组件的引用
	private Frame f;
	private Button but;
	FrameDemo()
	{
		init();
	}
	public void init()  //初始化方法
	{
		f=new Frame("my frame");
		//对frame进行基本设置
		f.setBounds(300,100,600,500);
		f.setLayout(new FlowLayout());

		but =new Button("my button");
		f.add(but);   //将组件添加到frame中 
		myEvent();/   /加载一下窗体上事件 
		f.setVisible(true);   //显示窗体
	}
	private void myEvent()
	{
		f.addWindowListener(new WindowAdapter()  //添加监听器
			{
				public void windowClosing(WindowEvent e)
				{
					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 FrameDemo();
	}
}

使用过程中经常会遇到一些些方法,textfield只有一行可写,textarea是一个区域,可以有很多行 ,textarea 的方法比textfield的多,,textarea可以加滚动条。

WindowAdapter是一个实现了WindowListener的类,Frame则是一个具体的显示窗体,Frame中添加WindowListener可以实现Frame事件的监听,也可以直接添加一个WindowAdapter来取代WIndowListener因为它已经实现了WindowListener,使用格式:
  frame.addWindowListener(new WindowAdapter(){});

WindowAdapter是个抽象类,里面对接口WindowListener的方法都进行了空实现,这样编程时不需要自己再去实现全部接口WindowListener里的方法,只需覆写自己需要的方法,其他的方法WindowAdapter都实现了。

练习:列出指定文件夹(或目录)的内容

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 Button okBut;
	private Label lab;

	MyWindowDemo() //构造函数
	{
		init();
	}
	public void init()
	{
		f=new Frame("my window");;
		f.setBounds(300,100,600,500);
		f.setLayout(new FlowLayout());//设置布局管理器,流布局

		tf=new TextField(30); //构造一个新文本区
		but =new Button("转到");
		ta=new TextArea(25,70);  //文本区25行,70列

	    d=new Dialog(f,"提示信息-self",true);  //新建提示对话框
		d.setBounds(400,200,240,150);
		d.setLayout(new FlowLayout());
		lab=new Label();
		okBut=new Button("确定");
		
		d.add(lab);
		d.add(okBut);

		f.add(tf);
		f.add(but);
		f.add(ta);
		
		myEvent();  //事件
		f.setVisible(true);

	}
	private void myEvent()
	{
		d.addWindowListener(new WindowAdapter()       
			{
				public void windowClosing(WindowEvent e)
				{
					d.setVisible(false);  //点×对话框关闭
				}
			});
		
		okBut.addActionListener(new ActionListener()  //给ok按钮添加监听
		{
			public void actionPerformed(ActionEvent e)
			{
				d.setVisible(false); //点ok按钮对话框隐藏
			}
		});

		tf.addKeyListener(new KeyAdapter()  //给enter键添加监听
		{
			public void keyPressed(KeyEvent e)
			{
				if (e.getKeyCode()==KeyEvent.VK_ENTER)
				{
					 showDir();
				}
			}
		}
			);
		
		but.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				 showDir();
			}
		});
/*添加监听器
这个是匿名类,就相当于写了一个类,继承WindowAdapter,然后又覆盖了它其中的一部分方法,
再新建这个类的一个实例,作为addWindowListener的参数~ */
		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);
				}
	}
	
	public static void main(String[] args) 
	{
		new MyWindowDemo();
	}
}
 
MenuBar菜单栏 ,将菜单栏与Frame对象关联,可以调用该框架的setMenuBar方法,actionListener() 是活动监听,用键盘也能操作该监听事件。

练习:添加菜单,使菜单具有打开文件和保存文件功能

import java.io.*;
import java.awt.*;
import java.awt.event.*;
public  class  MyMenuDemo
{
	private Frame f;
	private MenuBar bar;
	private Menu m,subMenu;
	private MenuItem closeItem,openItem,saveItem,subItem;
	private TextArea ta;
	private File file;

	private FileDialog openDia,saveDia;

	MyMenuDemo()
	{
		init();
	}
	public void init()
	{
		f=new Frame("my window");;
		f.setBounds(300,100,600,500);
		//f.setLayout(new FlowLayout());

		bar=new MenuBar();  //菜单栏
		m=new Menu("文件");  //菜单
		subMenu=new Menu("子菜单");
		ta=new TextArea();

		openItem=new MenuItem("打开");
		saveItem=new MenuItem("保存");
		closeItem= new MenuItem("退出"); //条目
		subItem= new MenuItem("子条目");
		subMenu.add(subItem);

		
		m.add(closeItem);//菜单里添加条目
		m.add(subMenu);
		m.add(saveItem);
		m.add(openItem);
		bar.add(m);  //  菜单栏里添加菜单
		f.setMenuBar(bar); //菜单栏与Frame对象关联

		openDia= new FileDialog(f,"我要打开",FileDialog.LOAD); //设置文件对话框属性为打开
		saveDia= new FileDialog(f,"我要保存",FileDialog.SAVE);

		f.add(ta);
		myEvent();
		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 ex)
				{
					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));
					String line = null;
					while ((line =bufr.readLine())!=null)
					{
						ta.append(line+"\r\n");
					}
					bufr.close();
				}
				catch (IOException ex)
				{
					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 MyMenuDemo();
	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值