一、基本概念
(http://blog.csdn.net/dandanzmc/article/details/24437181)
GUI全称Graphical User Interfaces,意为图形用户户界面,又称为图形用户接口,GUI指的就是采用图形方式显示的计算机操作用户界面,打个比方吧,我们点击QQ图标,就会弹出一个QQ登陆界面的对话框。这个QQ图标就可以被称作图形化的用户界面。
实现GUI编程的必不可少的三个条件是组件、事件
组件
组件就是一些基本的图形元素,包含有两类组件,一类是像我们经常用到的按钮、文本框、文本域、多选按钮、单选按钮等;另一类是我们经常说到的容器,比如说窗体、Panel等,它的作用主要是用来组织界面上的组件或者单元。
AWT组件
AWT组件是重量级组件,它依赖于本地操作系统的GUI,缺乏平台独立性。但是AWT组件简单稳定,兼容于任何一个JDK版本。
AWT所涉及到的类一般在java.awt的包及其子包中。java.awt中的类负责与本地操作系统进行交互,让本地操作系统显示和操作组件。
AWT中的两个核心类是Container(容器)和Component类
Component类
Java图形用户界面最基本组成部分是Component,Component类及其子类的对象用来描述以图形化的方式显示在屏幕上并能够与用户进行交互的GUI元素(标签、按钮)。
Container类
用来组织界面上的组件或者单元。有两种常用的Container(容器),一是Window,Window对象表示自由停泊的顶级窗口,另一个是Panel
对象可作为容纳其他Component对象,但不能够独立存在,必须被添加到其他
Container中,比如说Window或者Applet中。
Container它有一定的范围和大小,一般都是矩形。也
有一定的位置,这个位置可分相对位置和绝对位置。
一个Container中可以包含其他Container,Container中可以嵌套Container,当Container显示时候,它里面的元素也被小时出来,当Container隐藏时或者关闭时,它包含的元素也被隐藏。
Component对象不能独立显示出来,必须放在某一Container对象中才可以显示出来。
Container是Component的子类,Container子类对象可以容纳别的Component对象。
Container对象也可以被当作Component对象添加到其他Container对象中。
事件
事件是指组件触发的动作事件,java中不同的事件由不同的监听器处理,组件是事件源对象,而监听器主要用来接收来自事件源对象产生的动作事件,然后对其处理。
事件监听
(http://www.jinxuliang.com/course/PPT/Show/54699909137e420664f62751)
说明:
事件实现过程中产生的对象:事件、事件源、监听器
事件:用户在界面上的某一个操作,通常使用各种输入设备,如鼠标、键盘等。
事件源:产生事件的组件,例如在一个按钮上的单击就是事件源
监听器:包含事件处理器,负责检查事件是否发生,若发生则激活事件处理器对其处理
监听过程: 当事件源对象产生某种事件时,先封装该事件的信息,然后向监听器传送此事件对象,监听器在接收到事件对象后,为了能让监听器检查组件是否发生了该事件,会向该事件源对象(即该组件)注册事件监听器,然后事件处理器会检查事件是否发生,如果发生了,那么激活事件处理器进行处理。
二、布局管理
- * 布局管理器
- * 1)容器中的组件的排放方式,就是布局.
- * 2)常见的布局管理器
- * FlowLayout(流式布局管理器)
- * 从左到右的顺序排列
- * Panel默认的布局管理器
- * BorderLayout(辩解布局管理器)
- * 东 南 西 北 中
- * Frame 默认的布局管理器
- * 不指定布局方式,默认 满屏覆盖,在添加一个 也是 满屏覆盖
- * GridLayout (网格布局管理器)
- * 规则的矩阵
- * CardLayout (卡片布局管理器)
- * 选项卡
- * GridBagLayout(网格包布局管理器)
- * 非规则的矩阵
- *
- * 事件监听机制组成
- * 事件源:
- * 事件:Event
- * 监听器:Listener
- * 时间处理:(引发事件后处理方式)
- *
- * 事件源:就是awt包或者swing包中的那些图像界面组件.
- * 事件:每个事件源都有自己特定的对应时间和共性时间.
- * 监听器:可以出发某一个事件的动作都已经封装到监听器中.
(http://takeme.iteye.com/blog/1876850)
三、事件监听
注意:
事件监听器接口:e.g., ActionListener
事件适配器:e.g. WindowAdaper, KeyAdapter, MouseAdapter……
实例:(马士兵--GUI)
/*范例名称:
* 原文件名称:
* 要点:
* 1. Java事件处理机制
* 2. 事件源、事件监听器概念及作用
* 3. 如何在一个现有组件上注册监听器
*
*/
import java.awt.*;
import java.awt.event.*;
public class GUI_MSB2{
public static void main(String[] args){
MyFrame f1=new MyFrame("First event frame");
// f1.setVisible(true);
}
}
class MyFrame extends Frame{
MyFrame(String str){
super(str);//设置title
setLayout(new BorderLayout());
Button button1=new Button("Press me");
button1.setActionCommand("Game over");//设置触发行为的命令名称
add(button1,BorderLayout.CENTER);
Monitor bh=new Monitor();
button1.addActionListener(bh);//添加监听器
setLocation(500, 500);
pack();//默认包裹
setVisible(true);
}
}
class Monitor implements ActionListener{
//重写监听器方法
public void actionPerformed(ActionEvent e){//e包含事件源相关信息
System.out.println("A button has been pressed"+
"the relative info is:\n " +
e.getActionCommand());
}
}
结果:
/*范例名称:
* 原文件名称:
* 要点:
* 1、 键盘响应事件(响应上下方向键试试)
*/
import java.awt.*;
import java.awt.event.*;
public class KeyTest{
public static void main(String[] args){
new MyFrame("KeyMonitor...");
}
}
class MyFrame extends Frame{
Label num1;
MyFrame(String str){
super(str);
setLayout(new BorderLayout());
num1=new Label();
add(num1,BorderLayout.CENTER);
num1.setText("0");
addKeyListener(new KeyMonitor());//添加键盘监听
pack();
setLocation(500, 500);
setVisible(true);
}
//监听键盘类(内部类)
private class KeyMonitor extends KeyAdapter{
public void keyPressed(KeyEvent e){
int keyCode=e.getKeyCode();
int numTemp;
switch(keyCode){
case KeyEvent.VK_UP:
numTemp=Integer.parseInt(num1.getText());
numTemp++;
num1.setText(""+numTemp);
System.out.println("向上方向键按下");
break;
case KeyEvent.VK_DOWN:
numTemp=Integer.parseInt(num1.getText());
numTemp--;
num1.setText(""+numTemp);
System.out.println("向下方向键按下");
break;
default:
System.out.println(e.getKeyChar()+"键按下");
break;
}
}
}
}
结果:
/*范例名称:
* 原文件名称:
* 要点:
* 1. Java实现画笔
* 2、 鼠标响应事件(注意MouseListener接口跟MouseAdapter类的使用;
* 3、窗口响应时间 (可以看看 匿名类 的实现,其实就是new了一个父类对象或者接口)
*/
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class MyMouseAdapter{
public static void main(String[] args){
new MyFrame("Drawing ...");
}
}
class MyFrame extends Frame{
ArrayList<Point> points=null;
MyFrame(String s){
super(s);
points=new ArrayList<Point>();
setLayout(null);
setBounds(300,300,400,300);
this.setBackground(new Color(204, 204, 255));
setVisible(true);
this.addMouseListener(new Monitor());
//添加 窗口关闭监听器 (因为不经常变动且代码量少,可以采用 匿名类的方式)
this.addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e){
setVisible(false);
System.exit(0);//正常退出
}
}
);
}
//重写paint函数
public void paint(Graphics g){
Color c=g.getColor();//保留现场
Iterator<Point> i=points.iterator();
while(i.hasNext()){
Point p=(Point)i.next();
g.setColor(Color.blue);
g.fillOval(p.x, p.y, 10, 10);//填充椭圆
}
g.setColor(c);//恢复现场
}
//添加点
public void addPoint(Point p){
points.add(p);
}
}
//鼠标监听器 (MouseAdapter这个需要注意)
class Monitor extends MouseAdapter{
public void mousePressed(MouseEvent e){
MyFrame f=(MyFrame)e.getSource();
f.addPoint(new Point(e.getX(), e.getY()));
f.repaint();//重绘窗口(原理是调用update();然后调用paint())
}
}
结果: