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

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

 1,简介

       GUI

          Graphical User Interface(图形用户接口).

          用图形的方式,来显示计算机操作的界面,这样更方便更直观

     CLI

         Command line User Interface(命令行接口)

        就是常见的Dos命令行操作

       需要记忆一些常用的命令,操作不直观

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

  Awt和Swing

      java.Awt:Absttact Window ToolKit(抽象窗口工具包),需要调用本地系统方法实现功能。属于重量级控件。对系统依赖性较强

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

继承关系图

 

Container:为容器,是一个特殊的组件,该组件可以通过add方法添加其他组件进来

 

  布局管理器

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

        常见的布局管理器

             FlowLayout(流式布局管理器)

                从左到右的顺序排列

                Panel默认的布局管理器

           BorderLayout(边界布局管理器)

              东,南,西,北中

              Frame默认的布局管理器

          GridLayout(网格布局管理器)

            规则的矩阵

          GardLayout(卡片布局管理器)   

               非规则的矩阵 

2,Frame

                 Frame基本界面步骤。代码如下:

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

/*
 * 创建图形化界面
 * 1,对窗体进行基本设置
 * 2,对窗体进行基本设置
 *      比如大小,位置,布局
 * 3,定义组件
 * 4,将组件通过窗体的add方法添加到窗体中。
 * 5,让窗体显示,通过setVisible(true)完成
 */
public class Test1 {
	public static void main(String[] args) {
		Frame f = new Frame("my awt");// 初始化不可见的,默认布局管理器,边界是布局,如果没有指定东南西北,就全部填充
		f.setSize(500, 100);// 设置横纵坐标
		f.setLocation(300, 200);// 距离左上角的左边的位置,上边的位置
		f.setLayout(new FlowLayout());
		Button b = new Button("按钮");
		f.add(b);
		f.setVisible(true);// 设置可见的

		// System.out.println("Hello world");
	}

}

3,事件监听机制

      事件源(组件)

      事件(Event)

      监听器 (Lisener)

      事件处理(引发事件处理方式)

  

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

/*
 * 事件监听机制的特点:
 * 1,事件源
 * 2,事件
 * 3,监听器
 * 4,事件处理
 * 事件源:就是awt包中或者swing包中的那些图形界面组件
 * 事件:每一个事件源都有自己特有的对应事件和共性事件
 * 监听器:将可以触发某一个事件的动作都已经封装了监听器中。
 * 以上三者:在java中都已经定义好了。
 * 直接获取其对象来用就可以了。
 * 我们要做的事情是,就是对产生的动作进行处理。
 */
public class Test2 {
	public static void main(String[] args) {
		Frame f = new Frame("my awt");// 初始化不可见的,默认布局管理器,边界是布局,如果没有指定东南西北,就全部填充
		f.setSize(500, 100);// 设置横纵坐标
		f.setLocation(300, 200);// 距离左上角的左边的位置,上边的位置
		f.setLayout(new FlowLayout());
		Button b = new Button("按钮");
		f.add(b);
		f.setVisible(true);// 设置可见的
		f.addWindowListener(new MyWin());// 添加监听器,监听器里面定义的都是动作
		// 匿名内部类的方法如下
		/*
		 * f.addWindowListener(new WindowAdapter(){ public void
		 * windowClosing(WindowEvent e){ System.out.println("关闭");
		 * System.exit(0); }
		 * 
		 * });
		 */
		// System.out.println("Hello world");
		// WindowAdapter 实现了WindowListener接口
	}

}

/*
 * //覆盖了7个方法。可是我只用到了关闭动作 //其他动作却必须重写 class MyWin implements WindowListener{
 * 
 * @Override public void windowActivated(WindowEvent e) { // TODO Auto-generated
 * method stub
 * 
 * }
 * 
 * @Override public void windowClosed(WindowEvent e) { // TODO Auto-generated
 * method stub
 * 
 * }
 * 
 * @Override public void windowClosing(WindowEvent e) { // TODO Auto-generated
 * method stub
 * 
 * }
 * 
 * @Override public void windowDeactivated(WindowEvent e) { // TODO
 * Auto-generated method stub
 * 
 * }
 * 
 * @Override public void windowDeiconified(WindowEvent e) { // TODO
 * Auto-generated method stub
 * 
 * }
 * 
 * @Override public void windowIconified(WindowEvent e) { // TODO Auto-generated
 * method stub
 * 
 * }
 * 
 * @Override public void windowOpened(WindowEvent e) { // TODO Auto-generated
 * method stub
 * 
 * } }
 */
// 因为WindowListener子类已经实现了WindwoListerer接口
// 并覆盖了其中所有的方法,那么我只要继承自Windowadapter覆盖我需要的方法即可
class MyWin extends WindowAdapter {
	public void windowClosing(WindowEvent e) {
		System.out.println("关闭");
		System.exit(0);
	}
}


4 Action事件

 组件活动时触发   代码如下:

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

public class Test3 {
	// 初始化
	Frame f = null;
	Button but = null;

	public Test3() {
		init();
	}

	public void init() {
		f = new Frame("my Frame");
		f.setBounds(300, 100, 600, 500);// 相当于setsize();setlocation();坐标和宽度高度

		f.setLayout(new FlowLayout());
		but = new Button("my button");
		// 价值窗体事件
		myEvent();
		f.add(but);
		f.setVisible(true);
	}

	private void myEvent() {
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		// 让按钮具备退出程序功能
		/*
		 * 按钮就是事件源 那么选择那个监听器呢? 通过关闭窗体了解到,想要知道那个组件具备什么样的特有监听器 需要查看该组件对象的功能
		 * (具体的组件支持哪些监听,只有组件自己知道,添加监听的方法肯定定义在组件自己内部)
		 */
		but.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {// 添加活动监听,所以参数是活动事件
				// TODO Auto-generated method stub
				System.out.println("退出按钮做的事");
				System.exit(0);
			}

		});// 由于接口方法只有一个,所以不需要适配器,方法超过三个的几乎有适配器
	}

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


5 鼠标事件

  在任何组件上都可以发生鼠标事件,入:鼠标进入组件,退出组件,在组件上方单机鼠标,

  拖动鼠标都发生鼠标事件,也就是说,组件可以成为发生鼠标事件的事件源

  事件类型是MouseEvent,即当发生鼠标事件时,MouseEvent类自动创建一个事件对象。

 MouseEvent类中有几个重要的方法。

1,getX();事件源的x坐标

2,getY();事件源的y坐标

3,getModifiers()获取鼠标的左键或右键。鼠标的左键和右键分别使用InputEvent类中的常量BUTTONI_MASK和BUTTON3来表示

4,getClickCount()获取鼠标被单机的次数

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

/*
 * 演示鼠标事件
 */
public class Test4 {
	// 初始化
	Frame f = null;
	Button but = null;

	public Test4() {
		init();
	}

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

		f.setLayout(new FlowLayout());
		but = new Button("my button");
		// 价值窗体事件
		myEvent();
		f.add(but);
		f.setVisible(true);
	}

	private void myEvent() {
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		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 Test4();
	}
}


6 键盘事件,文本框只能输入数字,组合键

 在java事件模式中,必需有发生事件的事件源. 当一个组件处于激活状态时.敲击任何一个键,就会发生键盘事件.

具体的看代码示例 如下:
    

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

/*
 * 演示鼠标事件
 */
public class Test5 {
	// 初始化
	Frame f = null;
	Button but = null;
	TextField tf = null;

	public Test5() {
		init();
	}

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

		f.setLayout(new FlowLayout());
		tf = new TextField(20);// 指定列数初始化,要求只能输入数字
		but = new Button("my button");
		// 价值窗体事件
		myEvent();
		f.add(tf);
		f.add(but);
		f.setVisible(true);
	}

	private void myEvent() {
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		// 给but添加一个键盘事件
		but.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_ENTER) {// 按下ctrl加上enter键组合键
					System.out.println("ctrl enter is run");
				}
				if (e.getKeyCode() == KeyEvent.VK_ENTER) {// 按下enter键退出
					System.exit(0);
				}
				System.out.println(KeyEvent.getKeyText(e.getKeyCode()) + ".."
						+ e.getKeyCode());
			}
		});
		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();// 不准备用默认的方式处理事件,默认是输入进去
				}
			}
		});
	}

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


7 Dialog 列出指定目录的内容,不存在的显示 示例

    Dialog类和Frame类都是window的子类。对话框必须依赖于某个窗口或组件,当它所依赖的窗口或组件消失时,对话框也消失;当它所依赖的窗口或组件可见时,对话框会自动恢复。

主要方法

    Dialog(Frame f,String s):构造一个具有标题s的初始化不可见的对话框,所依赖的窗口。

    Dialog(Frame f,String s,boolean b):构造一个具有标题s的初始化不可见的对话框所依赖的窗口,b决定对话框是有模式或无模式。

   getTitle();获取对话框标题

   setTitle();设置对话框的标题

   setModel(boolean b)设置对话框的模式

   setSize();设置对话框的大小

  setVisible(boolean b)

对话框的模式

  有模式对话框:对话框牌激活状态,只让程序响应对话框内部的事件,程序不能再激活它所依赖的窗口或组件,并堵塞其他线程的执行。

  无模式对话框处于非激活状态,程序仍能激活它所依赖的窗口或组件,它也不堵塞线程的执行

 

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

/*
 * 列出指定目录的内容
 */
public class Test6 {
	private Frame f;
	private TextField tf;
	private Button btn;
	private TextArea ta;
	private Dialog d;
	private Label lbl;
	private Button okbtn;

	public Test6() {
		init();
	}

	public void init() {
		f = new Frame("my window");
		f.setBounds(300, 100, 600, 600);
		f.setLayout(new FlowLayout());
		tf = new TextField(30);
		btn = new Button("转到");
		ta = new TextArea(15, 40);

		d = new Dialog(f, "提示信息——自己的self", true);// true代表如果不操作对话框,模式操作不了
		d.setBounds(400, 200, 200, 100);
		d.setLayout(new FlowLayout());
		lbl = new Label();
		okbtn = new Button("确定");
		d.add(lbl);
		d.add(okbtn);
		f.add(tf);
		f.add(btn);
		f.add(ta);
		myEvent();
		f.setVisible(true);
	}

	public void myEvent() {
		tf.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				if (e.getKeyCode() == KeyEvent.VK_ENTER) {
					show();
				}
			}
		});
		okbtn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				d.setVisible(false);
			}

		});
		d.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				d.setVisible(false);
			}
		});
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		btn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				show();
			}

		});
	}

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

	private void show() {
		String path = tf.getText();
		File dir = new File(path);
		if (dir.isDirectory() && dir.exists()) {
			String[] names = dir.list();
			ta.setText("");
			for (String name : names) {
				ta.append(name + "\r\n");
			}
			tf.setText("");
		} else {
			String info = "您输入的信息:" + path + "是错误的的";
			lbl.setText(info);
			d.setVisible(true);
		}
	}
}


  8,MenuBar,包含子菜单选项

菜单是窗口中常见的界面,是由

菜单项 (MenuBar)  菜单(Menu) 菜单项(MenuItem) 复选菜单项(CheckboxMenuItem)等对象组成

MenuBar  就是负责创建菜单条的,即MenuBar的一个实例就是一个菜单项。MenuBar bar=new MenuBar();

Frame类有一个将菜单条放置到窗口中的方法,其一般格式为:setMenuBar(MenuBar menubar);,只能向窗口添加一个菜单条

Menu()建立一个空标题的菜单

Menu(String s)建立一个指定标题菜单,由参数s确定

若要创建菜单Menu,并添加到空菜单条对象bar中,可执行:Menu m1=nw Menu("file"); bar.add(m1);

MenuItem 类负责为菜单创建菜单项,或为每个菜单项创建其包含的更小的菜单子项MenuItem,并把菜单子项添加到菜单项中。

MenuItem open=new MenuItem("open");  m1.add(open);

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

public class Test7 {
	private Frame f;
	private MenuBar mb;
	private Menu m, subMenu;
	private MenuItem coloseItem, subItem;

	public Test7() {
		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("子条目");
		coloseItem = new MenuItem("退出");
		subMenu.add(subItem);
		m.add(subMenu);
		m.add(coloseItem);
		mb.add(m);
		f.setMenuBar(mb);
		myEvent();
		f.setVisible(true);
	}

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

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


9,FileDialog一个简单的保存文件读取文件的文本编辑器。

是Dialog的子类

    FileDialog(Dialog parent,String title, int mode)

zh_cn
创建一个具有指定标题的文件对话框窗口,用于加载或保存文件。

如果 mode 的值为 LOAD,那么文件对话框将查找要读取的文件,所显示的文件是当前目录中的文件。如果mode 的值为SAVE,则文件对话框将查找要写入文件的位置。

parent
zh_cn
对话框的所有者
title
zh_cn
对话框的标题;接受 null 值时不会抛出 NullPointerException
mode
zh_cn
对话框的模式,FileDialog.LOADFileDialog.SAVE

 
import java.awt.*;
import java.awt.event.*;
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 Test8 {
	private Frame f;
	private MenuBar mb;
	private Menu fileMenu;
	private MenuItem openItem, saveItem, closeItem;
	private FileDialog openDia, saveDia;
	private TextArea ta;
	private File file;

	public Test8() {
		init();
	}

	public void init() {
		f = new Frame("my window");
		f.setBounds(300, 100, 500, 600);
		mb = new MenuBar();
		fileMenu = new Menu("文件");
		openItem = new MenuItem("打开");
		saveItem = new MenuItem("保存");
		closeItem = new MenuItem("退出");
		ta = new TextArea();
		fileMenu.add(openItem);
		fileMenu.add(saveItem);
		fileMenu.add(closeItem);
		mb.add(fileMenu);
		f.setMenuBar(mb);
		f.add(ta);
		openDia = new FileDialog(f, "我要打开", FileDialog.LOAD);
		saveDia = new FileDialog(f, "我要保存", FileDialog.SAVE);
		myEvent();
		f.setVisible(true);

	}

	private void myEvent() {

		saveItem.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				if (file == null) {
					saveDia.setVisible(true);
					String path = saveDia.getDirectory();// 得到文件夹
					String name = saveDia.getFile(); // 得到文件名字
					if (path == null || name == null) {
						return;
					}
					file = new File(path, name);
				}
				try {
					BufferedWriter bufw = new BufferedWriter(new FileWriter(
							file));
					String text = ta.getText();
					bufw.write(text);
					bufw.close();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		openItem.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				openDia.setVisible(true);
				String path = openDia.getDirectory();// 得到文件夹
				String name = openDia.getFile(); // 得到文件名字
				// System.out.println(path+"..."+name);
				if (path == null || name == null) {
					return;
				}
				file = new File(path, name);
				ta.setText("");
				try {
					BufferedReader br = new BufferedReader(new FileReader(file));
					String text = ta.getText();
					String line = null;
					try {
						while ((line = br.readLine()) != null) {
							ta.append(line + "\r\n");
						}
						br.close();
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				} catch (FileNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}

			}

		});

	}

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











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值