黑马程序员——Java基础--GUI

-----------android培训java培训java学习型技术博客、期待与您交流!------------

GUI(用户图形界面)

一、概述

        计算机与用户交互的两种方式一种就是我们之前学习的CLI命令行用户接口,英文名叫Command LineUser Interface,即常见的Dos命令行操作。而另一种就是今天我要总结的GUI又叫图形用户接口,英文名叫Graphical User Interface简单的说就是用图形的方法来显示计算机的操作界面,为此,java给我们提供了java.Awt包和javax.Swing两个包。

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

        javax.Swing包:在AWT的基础上建立的一套图形界面系统,其中提供了更多的组件,且完全由java实现,增强了移植性,属轻量级控件。

二、继承关系

Container常用子类:Window   Panel(面板,不能单独存在。)

Window常用子类:Frame  Dialog


三、布局管理

1、创建Frame窗体:

        Frame f = new Frame("my Frame");//可设置标题,即窗体名字

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

        f.setSize(int wight,int hight);//窗体大小设置

        f.setLocation(int x,int y);//窗体显示位置设置,横纵坐标

        f.setBounds(int x,int y,int wight,int hight),也可以直接用这个方法对大小和位置设置

        f.setLayout(Layout layout),参数为指定的布局管理器,如FlowLayout

3、定义组件:

       Button b = new Button(“my Button”);//可设置组件的名称

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

        f.add(b);//将按钮组件添加进窗体

5、让窗体显示:

        f.setVisible(boolean b);//通过设置参数是true还是false是否显示窗体

举例:

package cn.itheima.gui;

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;

/*
 * 简单的窗体创建
 * 
 */
public class GuiDemo {
	public static void main(String[] args) {
		//创建窗体对象
		Frame f = new Frame("操作练习");
		//窗体大小设置
		f.setSize(200, 200);
		//窗体显示位置设置,横纵坐标
		f.setLocation(2, 2);
		//设置布局方式
		f.setLayout(new FlowLayout());
		//定义一个组件及名称
		Button b = new Button("点我");
		//将按钮组件添加进窗体
		f.add(b);
		//通过设置参数是true还是false是否显示窗体
		f.setVisible(true);
	}
}

四、事件监听机制

1事件源(组件):就是awtswing包中的那些图形界面组件

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

3监听器(Listener):将可触发某一事件的动作(不只一个动作),都封装到侦听器中。

4事件处理:负责处理事件的具体实现

事件监听机制的处理流程图:

常见事件的处理机制:

        事件源为鼠标,对应的事件类是MouseEvent,包括具体的事件:鼠标按下、松开、右键等,其相应的事件监听接口是MouseListener。同样的当事件源为窗口的时候。对应的事件类和事件监听接口分别是WindowEventWindowListener

        在这个实例中,为了简化编程,JDK为我们提供了简化编程的处理,我们只要实现了接口的所有方法就行了,不用处理。

五、常见的事件及其处理

1、

package cn.itheima.gui;

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/* 
	需求:让窗体的关闭功能实现 
      让按钮也具备退出程序的功能 
*/
public class GuiDemo2 {
	private Frame f;
	private Button b;
	//构造方法 
	GuiDemo2(){
		init();
	}
	//窗体创建与功能实现 
	public void init(){
		//实例化组件 
		f = new Frame("我的窗口");
		f.setBounds(200, 200, 200, 200);//设置大小和位置
		f.setLayout(new FlowLayout());
		b = new Button("点我");
		f.add(b);
		//加载窗体上事件
		myEvent();
		//显示窗体
		f.setVisible(true);
	}
	//注册事件 
	private void myEvent(){
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		//让按钮具备退出程序的功能  
		/* 
        按钮就是事件源。 
        那么选择哪个监听器呢? 
        通过关闭窗体示例了解到,想要知道哪个组件具备什么样的特有监听器。 
        需要查看该组件对象的功能。 
        通过查阅button的描述。发现按钮支持一个特有监听addActionListener。 
		*/
		b.addActionListener(new ActionListener() {
			private int count = 1;
			public void actionPerformed(ActionEvent e) {
				Button b = (Button)e.getSource();
				Frame f = (Frame)b.getParent();
				f.add(new Button("button-"+count++));
				f.validate();
			}
		});
	}
	public static void main(String[] args) {
		new GuiDemo2();
	}
}

2、

package cn.itheima.gui;

import java.awt.*;
import java.awt.event.*;
/*
 * 共性事件:键盘事件和鼠标事件 
 * 需求:在窗体中列出指定目录内容
*/
public class MouseAndKeyEvent {
	//全局变量的界面组件引用 
	private Frame f;
	private Button but;
	private TextField tf;
	private TextArea ta;
	//构造方法
	MouseAndKeyEvent() {
		init();
	}
	//窗体创建与功能实现
	public void init() {
		//组件实例化
		f = new Frame("我的窗口");
		f.setBounds(300, 100, 600, 500);
		f.setLayout(new FlowLayout());
		tf = new TextField(20);
		ta =new TextArea(30,50);
		but = new Button("点我");
		//添加组件
		f.add(tf);
		f.add(but);
		f.add(ta);
		//窗体事件
		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("您输入的数字非法,请重数。。。");
					e.consume();//不显示输入的字符
				}
			}
		});
		// 给But添加一个键盘监听。
		but.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				//捕获同时按下ctrl+entry
				if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_ENTER)
					System.exit(0);
				System.out.println("ctrl+enter is run");
				System.out.println(KeyEvent.getKeyText(e.getKeyCode()) + "...."
						+ e.getKeyCode());
			}
		});
		//鼠标活动事件
		but.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.out.println("按钮是ok的");
			}
		});
		//鼠标事件
		but.addMouseListener(new MouseAdapter() {
			private int count = 1;
			private int clickCount = 1;

			public void mouseEntered(MouseEvent e) {
				System.out.println("鼠标进入到该组件" + count++);
			}

			public void mouseClicked(MouseEvent e) {
				if (e.getClickCount() == 2)
					System.out.println("双击动作" + clickCount++);
			}
		});
	}

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

3、

package cn.itheima.gui;

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

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("my window");
		f.setBounds(300, 100, 600, 500);
		f.setLayout(new FlowLayout());

		tf = new TextField(60);

		but = new Button("转到");

		ta = new TextArea(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() {

		okBut.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);
		}
	}

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

六、菜单创建

package cn.itheima.gui;

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

public class MyMenuDemo {

	private Frame f;
	private MenuBar mb;
	private Menu m, subMenu;
	private MenuItem closeItem, subItem;

	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("文件");

		subMenu = new Menu("子菜单");

		subItem = new MenuItem("子条目");
		closeItem = new MenuItem("退出");

		subMenu.add(subItem);

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

		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();
	}
}

-----------android培训java培训、java学习型技术博客、期待与您交流!------------


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值