Java基础<十三>_GUI

GUI

一、GUI

    1.1、概述

    GUI:Graphical User Interface(图形用户接口),用图形的方式与用户进行交互,使得操作更加简单易懂,计算机的推广很大的功劳来源于GUI。

    CLI:CommandLine User Interface(命令行用户接口),即Dos命令行操作,需要记住常用指令,早期的计算机就是这种形式,操作不直观,windows系统中,基本被GUI替代,但在Linux系统中仍然有相当重要的地位。

    在java中,操作GUI的组件以及方法等等都封装在awt和swing两个工具包中。

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

    Javax.Swing:是在awt的基础上,建立的一套图形化界面系统,轻量级控件;其中提供了更多的组件,而且完全由java实现,不依赖本地系统。

    awt中常用组件的关系如下图所示:


    注意:Container:即容器,是一个特殊的组件,该组件中可以通过add方法添加其他的组件

    布局管理器:即容器中各组件的排放方式。

    常见的布局管理器:

        FlawLayout(流式布局管理器):从左到右的顺序排列,Panel默认;

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

        GridLayout(网格布局管理器):规矩的矩形;

        CardLayout(卡片布局管理器):选项卡;

        GridBagLayout(网格包布局管理器):非规则的矩形。

    创建图形化界面的步骤:

    1、创建frame窗体;

    2、对窗体进行基本设置;比如:大小、位置、布局等等;

    3、定义组件;

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

    5、让窗体显示,通过setVisible(true)完成。

    1.2、事件监听机制

    事件监听机制由事件源、事件、监听器、事件处理四个部分组成。

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

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

    监听器:用于封装可以触发某一事件的动作;

    事件处理:以上三者,在java中都已经定义好了,直接获取其对象即可;我们需要做的,就是事件处理

    事件监听机制如下图所示:


    事件监听机制的实现:1、确定事件源(容器或者组件);2、通过事件源对象的addXxxListener()方法将监听器注册到该事件源上;3、该方法接收的是XxxListener的子类对象,或者XxxAdapter的子类对象,一般用匿名内部类表示;4、覆盖特定事件的方法。

    注意:XxxAdapter是Xxxlistener的子类,复写了所有的抽象方法,但由于创建对象无意义,所以XxxAdapter定义为抽象类 。因为WindowListener的子类windowAdapter已经实现了windowListener接口,并覆盖了其中的所有方法,那么我们只要继承自windowadapter,并覆盖我们需要的方法即可。总之,适配器继承于监听器,并覆盖了相应的方法,使用适配器不必覆盖多余的方法

常用的监听器有:窗体监听器WindowListener,活动监听器ActionListener,鼠标监听器MouseListener,键盘监听器KeyListener。当监听器有三个及三个以上的方法时,一般都有相匹配的适配器!

    菜单

    菜单:MenuBar、Menu、MenuItem;先创建菜单条,再创建菜单,每一个菜单中建立菜单项;也可以菜单添加到菜单中,作为子菜单;通过setMenuBar()方法,将菜单添加到Frame中。

    菜单的继承关系如下图所示:


1、基本的演示:

package itheima.day22;

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class FrameDemo {
	
	/*1、定义该图形中所需的组件引用*/
	private Frame f;
	private Button but;
	private TextField tf;//文本区域
	
	FrameDemo(){
		init();
	}
	
	public void init(){
		f = new Frame("这是一个框架");
		//对frame进行基本设置
		f.setBounds(200, 300, 400, 500);//设置,位置,大小
		f.setLayout(new FlowLayout());//设置流式布局,默认是边界布局
		
		but = new Button("一个按钮");
		tf = new TextField(20);//指定列数
		
		//将组件添加到frame中
		f.add(but);
		f.add(tf);
		
		//加载一下窗体上事件
		myEvent();
		
		//显示窗体
		f.setVisible(true);
	}
	
	private void myEvent(){
		//给窗体增加监听的功能,
		f.addWindowListener(
				new WindowAdapter(){
					@Override
					public void windowClosing(WindowEvent e) {//关闭窗口
						System.exit(0);
					}
				});
		//按钮的活动监听
		but.addActionListener(new ActionListener(){//活动监听器
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("action ok");	
			//	System.out.println("按钮退出程序");
			//	System.exit(0);
			}
		});
		//监听鼠标事件
		but.addMouseListener(new MouseAdapter(){//鼠标监听器
			int enter;
			int clicked;
			@Override
			public void mouseClicked(MouseEvent e) {
				if(e.getClickCount()==2)
					System.out.println("双击按钮:"+clicked++);
			//	System.out.println("点击按钮:"+clicked++);
			}
			@Override
			public void mouseEntered(MouseEvent e) {
				System.out.println("鼠标进入按钮::"+enter++);
			}	
		});
		
		tf.addKeyListener(new KeyAdapter(){//键盘监听器
			@Override
			public void keyPressed(KeyEvent e) {
				int code = e.getKeyCode();
				if(!(code >=KeyEvent.VK_0 && code <=KeyEvent.VK_9)){
					System.out.println(code+":::非法的");
					e.consume();//非法的无法进去
				}
			}	
		});	
	}
	
	public static void main(String[] args){
		 new  FrameDemo();
	}
}

2、演示在窗体中显示文件列表

package itheima.day22;

import java.awt.Button;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;

public class MyWindowDemo {

	private Frame f;
	private TextField tf;
	private Button but;
	private TextArea ta;
	
	private Dialog d;//窗体
	private Label lab;
	private Button okBut;
	
	MyWindowDemo(){
		init();
	}
	
	public void init(){
		f = new Frame("我的窗体");//创建窗体
		f.setBounds(300,100,600,500);//设置位置,大小
		f.setLayout(new FlowLayout());//设置流式布局
		
		tf = new TextField(70);//文本行
		but = new Button("转到");//按钮
		ta = new TextArea(25,70);//文本区域
		
		d = new Dialog(f,"提示信息--self",true);//对话框,模式为true,模态形式
		d.setBounds(400,200,400,250);
		d.setLayout(new FlowLayout());
		
		lab = new Label();//标签
		okBut = new Button("确定");
		
		d.add(okBut);//对话框中添加一个按钮
		d.add(lab);//对话框中添加一个标签
		
		f.add(tf);//给窗体添加组件
		f.add(but);
		f.add(ta);
		
		myEvent();//事件监听
		
		f.setVisible(true);//可视化
	}
	
	private void myEvent(){
		f.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e) {//窗体的关闭功能
				System.exit(0);
			}
		});
		
		d.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e) {//对话框的关闭功能
				d.setVisible(false);
			}	
		});
		
		tf.addKeyListener(new KeyAdapter(){
			@Override
			public void keyPressed(KeyEvent e) {//文本行的接收键盘输入的功能
				if(e.getKeyCode() == KeyEvent.VK_ENTER)//回车
					showDir();
			}
		});
		
		okBut.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {//对话框中确定按钮的活动监听
				d.setVisible(false);
			}
		});
		
		but.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {//窗体中转到按钮的活动监听
				showDir();
			}		
		});	
	} 
	
	private void showDir(){//显示目录
		
		String dirPath = tf.getText();//获取文本行里面的内容
		
		File dir = new File(dirPath);//封装成为一个File对象,方便操作
		
		if(dir.exists() && dir.isDirectory()){//存在并且是一个文件夹
			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();
	}
}

3、演示打开保存文件的功能

package itheima.day22;

import java.awt.FileDialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class MyMenuDemo {

	private Frame f;//窗体
	private MenuBar bar;//菜单栏
	private Menu fileMenu,subMenu;//菜单
	private MenuItem closeItem,subItem;//菜单条
	
	private MenuItem openItem,saveItem;//打开、保存、菜单条
	
	private FileDialog openDia,saveDia;//文件对话框
	
	private TextArea ta;//文本区域,用于显示打开文件的内容
	
	private File file;//文件
	
	MyMenuDemo(){
		init();
	}
	
	public void init(){
		//窗体
		f = new Frame("my window");
		f.setBounds(300,100,500,600);
		f.setLayout(new FlowLayout());
		
		bar = new MenuBar();//菜单栏
		fileMenu = new Menu("文件");
	//	subMenu = new Menu("子菜单");
		
		subItem = new MenuItem("子条目");
		closeItem = new MenuItem("退出");
		
		openItem =  new MenuItem("打开");
		saveItem = new MenuItem("保存");
		
		ta = new TextArea(30,60);
		
	//	subMenu.add(subItem);
	//	m.add(subMenu);
		fileMenu.add(openItem);//菜单中加入打开菜单
		fileMenu.add(saveItem);//保存
		fileMenu.add(closeItem);//关闭
		bar.add(fileMenu);//在菜单栏中添加菜单
		
		f.setMenuBar(bar);//窗体中增加菜单栏
		f.add(ta);//窗体中加入文本区域
		
		openDia = new FileDialog(f,"打开",FileDialog.LOAD);//打开对话框
		saveDia = new FileDialog(f,"保存",FileDialog.SAVE);//保存对话框
		
		myEvent();//事件
		f.setVisible(true);//窗体的可视化
	}
	
	private void myEvent(){
		f.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e) {//窗体关闭功能
				System.exit(0);
			}
		});
		closeItem.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e) {//关闭菜单项的关闭功能
				System.exit(0);	
			}
		});
		
		openItem.addActionListener(new ActionListener(){//打开菜单项的活动监听
			@Override
			public void actionPerformed(ActionEvent e) {
				openDia.setVisible(true);//显示打开对话框
				
				String dirPath = openDia.getDirectory();
				String fileName = openDia.getFile();
				
				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 e1) {
					throw new RuntimeException("文件读写异常");
				}
			}
		});
		saveItem.addActionListener(new ActionListener(){//保存菜单项的活动监听
			@Override
			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);//封装成FIle对象,方便操作
				}
				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("文件读写异常");
				}
			}
		});
	}
	public static void main(String[] args) {
		new MyMenuDemo();	
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值