GUI概述
GUI 是Graphical User Interface(图形用户接口) 的缩写,用图形的方式来显示计算机操作的界面,这样更方便直观
计算机有两种方式和用户交互:
1,命令行,这种交互方式需要记住很多命令 比较麻烦
2,图形化界面 所有命令通过文字或者图形表现,方面直观
2,图形化界面 所有命令通过文字或者图形表现,方面直观
CLI Command line User Interface(命令行用户接口),就是常见的Dos 命令行操作,需要记住一些常用的命令,操作不直观
java 为GUI 提供的对象都在java.Awt 和java.Swing
java 为GUI 提供的对象都在java.Awt 和java.Swing
Awt 和Swing
java.awt: Abstract Window ToolKit (抽象窗口工具包)
需要调用本地系统方法实现功能,属于重量级组建,对系统的依赖性比较强
javax.Swing:在Awt 的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由java 实现增强了移植性,属于轻量级控件。
javax.Swing:在Awt 的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由java 实现增强了移植性,属于轻量级控件。
GUI继承关系
GUI 布局
容器中的组件排放方式就是布局
常见的布局管理器:
1,Flow Layout (流式布局管理器)
容器中的组件排放方式就是布局
常见的布局管理器:
1,Flow Layout (流式布局管理器)
从左到右的的序列排列组件,是Panel 默认的布局管理器
2,BorderLayout(边界布局管理器)
2,BorderLayout(边界布局管理器)
东,南,西,北,中 布局,是Frame 默认的布局管理器
3,GridLayout(网格布局管理器)
规则的矩阵
4,CardLayout(卡片布局管理器)
选项卡
5,GridBagLayout(网格包布局管理器)
非规则的矩阵
使用哪个布局管理器就创建哪个布局管理器对象
3,GridLayout(网格布局管理器)
规则的矩阵
4,CardLayout(卡片布局管理器)
选项卡
5,GridBagLayout(网格包布局管理器)
非规则的矩阵
使用哪个布局管理器就创建哪个布局管理器对象
Frame
以Frame 为例,了解Component的主要方法的使用
1,创建Frame窗体
new Frame() 对象
构造函数:
Frame()
Frame(String title);//定义窗体名字
2,对窗体进行基本设置
设置大小 setSize(int width, int height)
设置位置 setLocation(int x, int y)将组件移到新位置。
设置布局 setLayout(LayoutManager mgr) 设置此容器的布局管理器。
3,定义组件
定义一个button组件
4,将组件通过窗体的add()方法添加到窗体中
5,让窗体显示
通过setVisible(true)方法实现
在开启一个图形化界面,就开启了一个线程
new Frame() 对象
构造函数:
Frame()
Frame(String title);//定义窗体名字
2,对窗体进行基本设置
设置大小 setSize(int width, int height)
设置位置 setLocation(int x, int y)将组件移到新位置。
设置布局 setLayout(LayoutManager mgr) 设置此容器的布局管理器。
3,定义组件
定义一个button组件
4,将组件通过窗体的add()方法添加到窗体中
5,让窗体显示
通过setVisible(true)方法实现
在开启一个图形化界面,就开启了一个线程
import java.awt.*;
class AwtDemo
{
public static void main(String[] args)
{
//创建窗体,并设置窗体的名字
Frame fr=new Frame("my awt");
//设置大小
fr.setSize(400,300);
//设置位置
fr.setLocation(200,200);
//设置布局为FlowLayout (要创建个布局管理器对象!!),Frame的默认布局是BorderLayout
fr.setLayout(new FlowLayout());//参数为布局管理器对象
//定义组件,并将组件添加到Frame中
Button b=new Button("这是个按钮");
fr.add(b);
//使窗体可见。放在最后
fr.setVisible(true);
System.out.println("Hello World!");
}
}
事件监听机制
只建立界面没有对界面按钮等建立效果,这就涉及到了事件监听机制
事件监听机制的组成
事件源(组件)
事件(event)
监听器(Listener)
事件处理(引发事件后处理方式)
事件监听机制的流程
有事件源(组件),将监听器注册到事件源中,当外部动作有监听器监听的动作作用到事件源上
就会产生事件对象,对象中封装着
事件源,监听器引发对事件的处理方式,将事件对象传给监听器的处理方式
监听机制的特点
1,事件源:awt包和swing 包中的图形界面组件
2,事件:每个事件源都有自己的特有的对应事件和共性事件
3,监听器: 将可以出发某个事件的动作(不止一个动作)都已经封装到了监听器中
4,事件处理
以上3个都在java中定义好了 ,可以直接获取对象使用,我们要做的是 对产生的动作进行处理
窗体事件
明确事件源后将监听器注册到事件源中
添加监听器:
addWindowListener(WindowListener l)
参数WindowListener 是一个接口,因此传的参数对象要实现接口的所有方法(7个方法)
方法很多实现会很麻烦,使用其子类 WindowAdapter
因为windowAdapter 已经实现了该接口,并覆盖了所有方法
只要继承WindowAdapter 覆盖需要的方法即可
常用方法:
需要关闭窗体 覆盖windowClosing(WindowEvent e)()方法
windowActived(WindowEvent e)(); 激活窗口时调用。//窗体在界面的最前端
windowOpened(WindowEvent e)(); 已打开窗口时调用。
明确事件源后将监听器注册到事件源中
添加监听器:
addWindowListener(WindowListener l)
参数WindowListener 是一个接口,因此传的参数对象要实现接口的所有方法(7个方法)
方法很多实现会很麻烦,使用其子类 WindowAdapter
因为windowAdapter 已经实现了该接口,并覆盖了所有方法
只要继承WindowAdapter 覆盖需要的方法即可
常用方法:
需要关闭窗体 覆盖windowClosing(WindowEvent e)()方法
windowActived(WindowEvent e)(); 激活窗口时调用。//窗体在界面的最前端
windowOpened(WindowEvent e)(); 已打开窗口时调用。
import java.awt.*;
import java.awt.event.*;//WindowAdapter 是这个包中的
class ListenerDemo
{
public static void main(String[] args)
{
Frame f=new Frame("My Listener");
f.setSize(300,200);
f.setLocation(200,200);
// f.addWindowListener(new MyListener());
//内部类形式
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)//关闭窗体事件
{
System.out.println("关闭窗口");
System.exit(0);
}
public void windowOpened(WindowEvent e)//打开窗体事件
{
System.out.println("我被打开了");
}
public void windowActivated(WindowEvent e)//激活窗体事件(注意方法名称拼写错误 windowActivated())
{
System.out.println("我被激活了,目前显示在最前端");
}
});
f.setVisible(true);
System.out.println("Hello World!");
}
}
Action 事件
Component 的方法
setBounds(int x, int y, int width, int height)
设置位置和窗体size
Button 按钮组件
方法:
addActionListener(ActionListener l)
添加指定的动作侦听器,以接收发自此按钮的动作事件。
ActionListener 接口是少数没有适配器的接口之一
因为只有一个方法
actionPerformed(ActionEvent e)发生操作时调用。
Component 的方法
setBounds(int x, int y, int width, int height)
设置位置和窗体size
Button 按钮组件
方法:
addActionListener(ActionListener l)
添加指定的动作侦听器,以接收发自此按钮的动作事件。
ActionListener 接口是少数没有适配器的接口之一
因为只有一个方法
actionPerformed(ActionEvent e)发生操作时调用。
import java.awt.*;
import java.awt.event.*;
class FrameDemo
{
//定义类中所有组件的引用
private Frame f;
private Button b;
FrameDemo() // 构造函数
{
init();//构造函数初始化时就具备该方法
}
public void init()//用来创建并设置窗体
{
f=new Frame();
f.setBounds(200,100,400,300);
f.setLayout(new FlowLayout());
b=new Button("这是个按钮");
f.add(b);
myEvent();
f.setVisible(true);
}
public void myEvent() //事件,(类继承类 方法不能继承类 extends WindowAdapter)
{
//窗体事件,让窗体具备关闭功能
f.addWindowListener(new WindowAdapter()//内部类
{
public void windowClosing(WindowEvent e)
{
System.out.println("窗口关闭");
System.exit(0);
}
}
);
// 让按钮具备退出功能
//按钮就是事件源 ,添加监听器 addActionListener
// 实例化 ActionListener 调用 actionPerformed(ActionEvent e)方法
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)//ActionEvent 不能忘记写
{
System.out.println("按钮窗口关闭");
System.exit(0);
}
});
}
public static void main(String[] args)
{
new FrameDemo();
}
}
鼠标事件 (共性事件)
addMouseListener(MouseListener l)添加指定的鼠标侦听器,以接收发自此组件的鼠标事件。
MouseListener 有适配器MouseAdapter
具体的方法
mouseClicked(MouseEvent e) 鼠标按键在组件上单击(按下并释放)时调用。
mouseEntered(MouseEvent e 鼠标进入到组件上时调用
mouseExited(MouseEvent e) 鼠标离开组件时调用
mousePressed(MouseEvent e) 鼠标按键在组件上按下时调用
mouseReleased(MouseEvent e) 鼠标按钮在组件上释放时调用。
addKeyListener(KeyListener l)
鼠标事件对象中有
getClickCount() 鼠标单击次数
//添加活动监听
//鼠标事件先执行,活动事件后执行,用键盘活动事件也执行,所以如果在按钮上添加事件的话要用活动事件
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
System.out.println("活动监听");
}
} );
//添加鼠标监听事件
b.addMouseListener(new MouseAdapter(){
int count=1;//内部类中定义的变量
int cl=1;
public void mouseEntered(MouseEvent e)
{
System.out.println("鼠标进入到按钮上"+count++);
}
public void mouseClicked(MouseEvent e)
{
if (e.getClickCount()==2)//如果鼠标点击两次 执行
{
System.out.println("鼠标点击(双击)"+cl++);
}
}
});
键盘事件(共性事件)
addKeyListener(KeyListener l)
KeyListener 接口 有适配器对象KeyAdapter
具体方法:
keyPressed(KeyEvent e)按下某个键时调用此方法。
void keyReleased(KeyEvent e) 释放某个键时调用此方法。
keyTyped(KeyEvent e) 键入某个键时调用此方法。
KeyEvent 的方法
getKeyChar()
getKeyCode()
InputEvent 是KeyEvent 的父类它的方法
boolean isControlDown() //ctrl 是否按下
consume();
KeyListener 接口 有适配器对象KeyAdapter
具体方法:
keyPressed(KeyEvent e)按下某个键时调用此方法。
void keyReleased(KeyEvent e) 释放某个键时调用此方法。
keyTyped(KeyEvent e) 键入某个键时调用此方法。
KeyEvent 的方法
getKeyChar()
getKeyCode()
InputEvent 是KeyEvent 的父类它的方法
boolean isControlDown() //ctrl 是否按下
consume();
//添加键盘监听
b.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{// 按esc 就退出
//if (e.getKeyCode()==KeyEvent.VK_ESCAPE)
//按ctrl+enter 退出
if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)
{
System.exit(0);
}
//System.out.println(e.getKeyChar()+"......."+e.getKeyCode());
//KeyEvent.getKeyText(e.getKeyCode);
}
}
);
//给文本框添加键盘监听
tf.addKeyListener(new KeyAdapter(){
public void keyPressed( KeyEvent e)
{
int code=e.getKeyCode();
if (!(code>=KeyEvent.VK_0&&code<= KeyEvent.VK_9))//如果键入的值不在1-0范围内
{
System.out.println(e.getKeyChar()+"不是数字");
e.consume();
}
}
});
GUI 菜单
MenuBar 菜单栏 或者菜单条
Frame中添加MenuBar
为了将该菜单栏与 Frame 对象关联,可以调用该框架的 setMenuBar 方法。
Menu(显示有箭头)
Menu Extends MenuItem
menu add()可以添加菜单和条目
MenuItem(显示没有箭头)
方法
添加活动监听器
addActionListener(ActionListener l)
了解菜单中菜单,菜单条 菜单项 的关系
import java.awt.*;
import java.awt.event.*;
class MyMenuDemo
{
private Frame f;
private MenuBar mbar;
private Menu me1,me2,subme;
private MenuItem closemit,submit;
MyMenuDemo()
{
init();
}
public void init()
{
f=new Frame("我的窗口");
f.setBounds(200,100,600,500);
f.setLayout(new FlowLayout());
mbar=new MenuBar();
me1=new Menu("文件");
me2=new Menu("编辑");//菜单初始化可以指定名字
subme=new Menu("子菜单");
closemit=new MenuItem("退出");
submit=new MenuItem("子项目");
//没有先后顺序
f.setMenuBar(mbar);//设置框架的菜单栏
mbar.add(me1);//菜单添加到菜单条上
mbar.add(me2);
me1.add(subme);
me1.add(closemit);//菜单项添加到菜单上
subme.add(submit);
myEvent();
f.setVisible(true);
}
public void myEvent()
{
//菜单项 添加监听器
closemit.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)//记住方法名字:actionPerformed()
{
System.exit(0);
}
});
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
public static void main(String[] args)
{
new MyMenuDemo();
}
}