20. 图形用户接口GUI (第二十二天)

 

一   概述

1.GUI

  • Graphical User InterFace (图形用户接口)
  • 用图形的方式,来显示计算机操作的界面,这样更方便、更直观。

2、CLI

  • Command line User Interface(命令行用户接口)
  • 就是常见的Dos命令行操作
  • 需要记忆一些常用的命令,操作不直观

3.举例:比如,创建文件夹,或者删除文件夹等

4.Javs为GUI提供的对象都存在java.Awt和javax.Swing两个包中。

5.Awt和Swing
java.Awt:
Abstract Window Tookit(抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件
javax.Swing:在AWT的基础上,建立的一套图像界面系统,其中提供了更多的组件,而且完全由于Java实现,增强了移植性,属轻量级控件。

二   GUI布局

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

2.常见的布局管理器:

(1)Flow Layout(流式布局管理器)

  • 从左到右的顺序排列
  • Panel默认的布局管理器

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

  • 东、南、西、北、中(上下左右中)
  • Frame默认的布局管理器

(3)GridLayout(网格布局管理器)

  • 规则的矩阵

(4)CardLayout(卡片布局管理器)

  • 选项卡

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

  • 非规则的布局      

三   GUI_Frame

创建图形化界面步骤如下:

  1. 常见frame窗体
  2. 对窗体进行基本设置(比如大小、位置、布局等等)
  3. 定义组件
  4. 将组件通过窗体的add方法添加到窗体中
  5. 让窗体显示,通过setVisible(true)

示例代码:

import java.awt.*;

public class Demo {
	public static void main(String[] args) throws Exception {
		// 默认是边界布局
		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);
		sop("my awt");
	}

	public static void sop(Object obj) {
		System.out.println(obj);
	}
}

上面的代码只是弄了个窗体显示,不会有任何反应。

四   事件监听机制

1.Container常用子类:Window Panel(面边,不能单独存在)
2.Window常用子类:Frame Dialog
3.简单的窗体创建过程:

Frame f = new Frame("my window");
f.setLayout(new FlowLayout());
f.setSize(500,400);//设置窗体大小
f.setLocation(300,200);//设置窗体出现在屏幕的位置
f.setVisible(true);

4.事件监听机制组成

  • 事件源(组件):就是awt或者swing包中的那些图形界面组件
  • 事件(Event):每一个事件源,都有自己的特有的对应事件,和共性事件
  • 监听器(Listener):将可以触发某一个事件的动作(不止一个动作)都已经封装到了监听器中
  • 事件处理方式(引发事件后处理方式)

5.组件、Event、Listener在Java中,都已经定义好了,直接获取其对象来用就可以了。我们要做的就是对产生的动作进行处理。

五   窗体事件

要使图形化窗口的按钮有反应,要了解下面这些方法:

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

1.WindowListener为接口,要想使用,必须先实现方法,很麻烦。他有一个实现类,子类,实现了接口,不过为空方法。

  public abstract class WindowAdapter extends Object implements WindowListener, WindowStateListener, WindowFocusListener

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

2.事件

void windowActivated(WindowEvent e): 激活窗口时调用

void windowClosed(WindowEvent e):当窗口已被关闭时调用

void windowClosing(WindowEvent e): 窗口正处在关闭过程中时调用 

void windowDeactivated(WindowEvent e):停用窗口时调用

void windowDeiconified(WindowEvent e):取消图标化窗口时调用

void windowGainedFocus(WindowEvent e)

该 Window 被设置为聚焦 Window 时调用,聚焦 Window 意味着该 Window 或其某个子组件将接收键盘事件。

void windowIconified(WindowEvent e):图标化窗口时调用

void windowLostFocus(WindowEvent e)

该 Window 不再为聚焦 Window 时调用,不再为聚焦 Window 意味着键盘事件不再传递到该 Window 或其任意子组件。

void windowOpened(WindowEvent e)

已打开窗口时调用。

void windowStateChanged(WindowEvent e)

窗口状态改变时调用。

示例代码:

/*
创建图形化界面
1、常见frame窗体
2、对窗体进行基本设置
    比如大小、位置、布局。
3、定义组件
4、将组件通过窗体的add方法添加到窗体中
5、让窗体显示,通过setvisible(true)
*/
import java.awt.*;
import java.awt.event.*;
public class Demo{
    public static void main(String[] args) throws Exception{
        //默认是边界布局
        Frame f = new Frame("my awt");
        //窗口的长宽
        f.setSize(500,400);
        //窗口距离显示器边距的距离
        f.setLocation(300,200);
        //默认是边界布局
        f.setLayout(new FlowLayout());
        //添加指定的窗口侦听器,以从此窗口接收窗口事件。
        f.addWindowListener(new MyWin());
        Button b = new Button("我是一个按钮");
        f.add(b);
        //设置可见
        f.setVisible(true);
        sop("my awt");
    }
   
    public static void sop(Object obj){
        System.out.println(obj);
    }
}

//因为WindowListener的子类WindowAdapter已经实现了WindowListener接口。
//并覆盖了其中的所有方法,那么我只要继承自WindowAdapter覆盖我需要的方法即可。
class MyWin extends WindowAdapter{
    public void windowClosing(WindowEvent e){
        Demo.sop("将要关闭");
        System.exit(0);
    }
    public void windowOpened(WindowEvent e){
        Demo.sop("我被打开");
    }   
    public void windowActivated(WindowEvent e){
        Demo.sop("激活");
    }
}

六   Action事件

事件监听机制

  • 确定事件源(容器或组件)
  • 通过事件源对象的addXXXLIstener()方法将监听器注册到该事件源上
  • 该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdaper的子类对象
  • 一般用匿名内部类来表示
  • 在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收
  • 事件出发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过getSource()或者,getComponet()获取)
import java.awt.*;
import java.awt.event.*;
public class Demo{
    //定义图形中所需的组件的引用
    private Frame f;
    private Button but;
    
    Demo(){
        init();
    }
    
    public static void main(String[] args) throws Exception{
        new Demo();
    }
    
    public void init(){
        f = new Frame("my frame");
        //对frame进行基本设置
        //f.setSize(500,400);
        //void setBounds(int x, int y, int width, int height)  移动组件并调整其大小。
        f.setBounds(300,400,600,500);
        f.setLayout(new FlowLayout());
        but = new Button("退出");
        //将组件添加到frame中
        f.add(but);
        //加载一下窗体上的事件
        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 sop(Object obj){
        System.out.println(obj);
    }
}

七   鼠标事件

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

public class Demo {
	// 定义图形中所需的组件的引用
	private Frame f;
	private Button but;

	Demo() {
		init();
	}

	public static void main(String[] args) throws Exception {
		new Demo();
	}

	public void init() {
		f = new Frame("my frame");
		// 对frame进行基本设置
		// f.setSize(500,400);
		// void setBounds(int x, int y, int width, int height) 移动组件并调整其大小。
		f.setBounds(300, 400, 600, 500);
		f.setLayout(new FlowLayout());
		but = new Button("退出");
		// 将组件添加到frame中
		f.add(but);
		// 加载一下窗体上的事件
		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) {
				sop("鼠标活动");
			}
		});
		but.addMouseListener(new MouseAdapter() {
			private int count = 1;
			private int clickCount = 1;

			public void mouseEntered(MouseEvent e) {
				sop("鼠标进入事件" + (count++));
			}

			public void mouseClicked(MouseEvent e) {
				if (e.getClickCount() == 2) {
					sop("鼠标双击事件");
				} else {
					sop("鼠标点击事件" + (clickCount++));
				}
			}
		});
	}

	public static void sop(Object obj) {
		System.out.println(obj);
	}
}

八   键盘事件

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

public class Demo {
	// 定义图形中所需的组件的引用
	private Frame f;
	private Button but;
	private TextField tf;

	Demo() {
		init();
	}

	public static void main(String[] args) throws Exception {
		new Demo();
	}

	public void init() {
		f = new Frame("my frame");
		// 对frame进行基本设置
		// f.setSize(500,400);
		// void setBounds(int x, int y, int width, int height) 移动组件并调整其大小。
		f.setBounds(300, 400, 600, 500);
		f.setLayout(new FlowLayout());
		but = new Button("退出");
		// 文本框
		tf = new TextField(20);

		// 将组件添加到frame中
		f.add(tf);
		f.add(but);
		// 加载一下窗体上的事件
		myEvent();
		// 显示窗体
		f.setVisible(true);
	}

	private void myEvent() {
		but.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
					System.exit(0);
				}
				if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_ENTER) {
					sop("ctrl + enter");
				}
				sop(KeyEvent.getKeyText(e.getKeyChar()) + "...."
						+ e.getKeyCode());
			}
		});
		tf.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				int code = e.getKeyCode();
				if (!(code >= KeyEvent.VK_0 && code <= KeyEvent.VK_9)) {
					sop(code + "是非法的");
					// 屏蔽键
					e.consume();
				}
			}
		});
	}

	public static void sop(Object obj) {
		System.out.println(obj);
	}
}

九   练习:列出指定目录内容

import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;

public class Demo {
	private Frame f;
	private TextField tf;
	private Button but;
	private TextArea ta;

	Demo() {
		init();
	}

	public static void main(String[] args) throws Exception {
		new Demo();
	}

	public void init() {
		f = new Frame("my window");
		f.setLayout(new FlowLayout());
		f.setBounds(300, 100, 600, 500);
		tf = new TextField(60);
		but = new Button("转到");
		ta = new TextArea(25, 70);
		f.add(tf);
		f.add(but);
		f.add(ta);
		myEvent();
		f.setVisible(true);
	}

	private void myEvent() {
		f.addWindowListener(new WindowAdapter() {
			public void windowCloseing(WindowEvent e) {
				System.exit(0);
			}
		});
		but.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String dirPath = tf.getText();
				tf.setText("");
				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");
					}
				}
			}
		});
	}

	public static void sop(Object obj) {
		System.out.println(obj);
	}
}

十   对话框Dialog

import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;

public class Demo {
	private Frame f;
	private TextField tf;
	private Button but;
	private TextArea ta;
	private Dialog dl;
	private Label lab;
	private Dialog d;
	private Button okBut;

	Demo() {
		init();
	}

	public static void main(String[] args) throws Exception {
		new Demo();
	}

	public void init() {
		f = new Frame("my window");
		f.setLayout(new FlowLayout());
		f.setBounds(300, 100, 600, 500);
		tf = new TextField(60);
		but = new Button("转到");
		ta = new TextArea(25, 70);
		f.add(tf);
		f.add(but);
		f.add(ta);
		lab = new Label();
		d = new Dialog(f, "提示信息-self", true);
		okBut = new Button("确定");
		d.setBounds(400, 200, 240, 150);
		d.setLayout(new FlowLayout());
		d.add(lab);
		d.add(okBut);
		myEvent();
		f.setVisible(true);
	}

	private void myEvent() {
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		but.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				showDir();
			}
		});
		d.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				d.setVisible(false);
			}
		});
		okBut.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				d.setVisible(false);
			}
		});
		tf.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				if (e.getKeyCode() == KeyEvent.VK_ENTER) {
					showDir();
				}
			}
		});
	}

	public void showDir() {
		String dirPath = tf.getText();
		tf.setText("");
		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 sop(Object obj) {
		System.out.println(obj);
	}
}

十一   菜单

import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;

public class Demo {
	private Frame f;
	private MenuBar mb;
	private Menu m, subMenu;
	private MenuItem closeItem, subItem;

	Demo() {
		init();
	}

	public static void main(String[] args) throws Exception {
		new Demo();
	}

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

		mb = new MenuBar();
		subMenu = new Menu("子菜单");
		m = new Menu("文件");
		closeItem = new MenuItem("退出");
		subItem = new MenuItem("子条目");

		subMenu.add(subItem);
		m.add(subMenu);
		m.add(closeItem);
		mb.add(m);

		myEvent();

		f.setMenuBar(mb);
		f.setVisible(true);
	}

	private void myEvent() {
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		closeItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
	}

	public static void sop(Object obj) {
		System.out.println(obj);
	}
}

十二、十三   练习-打开、保存文件

import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
public class Demo{
    private Frame f;
    private TextArea ta;
    private MenuBar bar;
    private Menu fileMenu;
    private MenuItem openItem,saveItem,closeItem;
    private FileDialog openDia,saveDia;
    private File file;
    Demo(){
        init();
    }
    public static void main(String[] args) throws Exception{
        new Demo();
    }
    public void init(){
        f = new Frame("my window");
        //f.setLayout(new FlowLayout());
        f.setBounds(300,100,500,600);
        ta = new  TextArea();
        bar = new  MenuBar();
        fileMenu  = new  Menu("文件");
       
        openItem  = new MenuItem("打开");
        saveItem  = new MenuItem("保存");
        closeItem  = new MenuItem("退出");
       
        fileMenu.add(openItem);
        fileMenu.add(saveItem);
        fileMenu.add(closeItem);
        bar.add(fileMenu);
       
        myEvent();
       
        f.add(ta);
        f.setMenuBar(bar);
       
        openDia = new FileDialog(f,"我要打开",FileDialog.LOAD);
        saveDia = new FileDialog(f,"我要保存",FileDialog.SAVE);
       
       
        f.setVisible(true);
    }
    private void myEvent(){
        f.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });   
        openItem.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                openDia.setVisible(true);
                String dirPath = openDia.getDirectory();
                String fileName = openDia.getFile();
                if(dirPath==null||fileName==null)
                    return;
                ta.setText("");
                openFile(dirPath,fileName);
                f.setTitle("文件:"+dirPath+fileName);
            }
        });       
        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;
                    saveFile(dirPath,fileName);
                    f.setTitle("文件:"+dirPath+fileName);
                }else{
                    saveFile();
                }
            }
        });       
        closeItem.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                System.exit(0);
            }
        });
    }
    public void openFile(String dirPath,String fileName){
        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");
            }
        }catch(IOException ioe){
            throw new RuntimeException("读取失败");
        }
    }
    public void saveFile(){
        saveFile(null,null);
    }
    public void saveFile(String dirPath,String fileName){
        if(file==null){
            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("读取失败");
        }
    }
    public static void sop(Object obj){
        System.out.println(obj);
    }
}

十四   jar包双击执行  


 jar -cvfm my.jar 1.txt mymenu
 Main-class: mymenu.Demo //要有空格和回车

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值