GUI概述:
GUI
Graphical User Interface(图形用户接口)。
用图形的方式,来显示计算机操作的界面,这样更方便更直观。
CLI
Command line User Interface (命令行用户接口)
就是常见的Dos命令行操作。 需要记忆一些常用的命令,操作不直观。
Awt与 Swing
java.Awt:Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件。(即依赖于系统资源,跨平台性较差)
javax.Swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件。(跨平台性较强)
Swing组件的继承体系:
该体系要记清楚,便于开发时查阅API文档
-----------------------------------------------------------------------------------------------------------
布局
容器中的组件的排放方式,就是布局。
常见的布局管理器:
FlowLayout(流式布局管理器)从左到右的顺序排列。
Panel 默认的布局管理器。
BorderLayout(边界布局管理器)东,南,西,北,中
Frame 默认的布局管理器。
GridLayout(网格布局管理器)规则的矩阵
CardLayout(卡片布局管理器)选项卡
GridBagLayout(网格包布局管理器)非规则的矩阵
其它高级布局:坐标式布局
Frame 是带有标题和边框的顶层窗口。
创建图形化界面的基本步骤:
1,创建Frame窗体
2,对窗体进行基本设置:大小、位置、布局等
3,定义组件:按钮、标签、复选框、文本组件等
4,将组建通过窗体的add方法添加到窗体中
5,让窗显示,通过setVisible(True)方法
事件监听机制
事件监听机制的特点:
1,事件源(组件):Awt或Swing包中图形界面组件
2,事件(Event):每一个女事件源都有自己特有的对应事件和共性事件
3,监听器(Listener):封装了可以触发某一个事件的动作(不止一个),监听器往往还具备适配器
4,事件处理(引发事件后处理方式)
123在java中都已经定义好了,我们要做的事情是:对产生的事件进行处理
------------------------------------------------------------------------------------
窗体事件
监听器隶属于awt.event包,
class MyListener implements WindowListener
{七个方法}
直接实现的话需要覆盖该接口的7个抽象方法,而需要用的方法可能只有一个
WindowListener 的子类WindowAdapter(适配器)实现了该接口,并覆盖了所有方法,我们只需继承WindowAdapter类并覆盖我们需要的方法即可
创建一个带监听器的窗口:
import java.awt.*;
import java.awt.event.*;//子包
class AwtDemo
{
public static void main(String[] args)
{
Frame f = new Frame("my Awt"); //构造一个新的、最初不可见的、具有指定标题的 Frame 对象。
f.setSize(618,400); //设置宽高
f.setLocation(300,200); //设置在屏幕上坐标位置
f.setLayout(new FlowLayout()); //设置流式布局
Button b = new Button("这是一个按钮");//创建按钮,默认为边界布局
f.add(b); //往容器里添加按钮
f.addWindowListener(new WindowAdapter()
{ //使用适配器,添加监听器
public void windowClosing(WindowEvent e){//覆盖父类方法,窗口正处在关闭过程中时调用。
System.out.println("关闭窗口");//打印
System.exit(0); //关闭程序,这个动作最为常见
}
public void windowActivated(WindowEvent e){//窗口处于最前端
System.out.println("激活窗口");
}
public void windowOpened(WindowEvent e){//打开窗口时触发
System.out.println("已打开窗口");
}
});
f.setVisible(true);
}
}
WindowEvent:即窗体事件,指示窗口状态改变的低级别事件。当打开、关闭、激活、停用、图标化
或取消图标化 Window 对象时,或者焦点转移到 Window 内或移出 Window 时,由 Window 对象生成此低级别事件
按钮监听
需求:
让按钮具备退出程序的功能;按钮就是事件源,应该选择哪个监听器呢?
通过关闭窗体示例了解到:要想知道哪个组件具备什么监听器,需要查看该组件对象的功能
查阅APT文档,button按钮支持一个特有监听器addActionListener(ActionListener);
ActionListener:事件监听器接口
该接口只有一个方法:void actionPerformed(ActionEvent e) 发生操作时调用
适配器的作用是为了便于调用监听器的方法,一般方法超过三个的监听器都具备适配器,ActionListener只有一个方法就没必要使用适配器了,直接继承即可
将窗体事件的代码优化并演示按钮:
import java.awt.*;
import java.awt.event.*;
class FrameDemo
{
private Frame f;//定义组件的引用
private Button but;
FrameDemo(){ //构造方法
init(); //调用方法
}
public void init() //初始化窗体
{
f = new Frame("my Frame");
f.setBounds(300,200,600,400);//移动组件并调整其大小。600*400
f.setLayout(new FlowLayout());//设置布局
but = new Button("mu Button");//设置按钮
f.add(but); //将组件添加到窗体
myEvent();//调用方法
f.setVisible(true); //显示窗体
}
private void myEvent() //封装事件
{
f.addWindowListener(new WindowAdapter(){//继承内部类,窗体监听器,窗体退出功能
public void windowClosing(WindowEvent e){//窗体事件
System.out.println("窗体退出");
System.exit(0);
}
});
but.addActionListener(new ActionListener(){//接口内部类,事件监听器,按钮退出功能
public void actionPerformed(ActionEvent e){//活动事件(按钮)
System.out.println("按钮退出");
System.exit(0);
}
});
}
public static void main(String[] args){
FrameDemo f = new FrameDemo();
}
}
鼠标事件
查看API,Button的父类Component方法void addMouseListener(MouseListener l) 添加鼠标侦听器,使用MouseListener接口及其适配器,进行鼠标事件的侦听
示例:
private void myEvent() //封装事件,都是以内部类的形式
{
f.addWindowListener(new WindowAdapter(){//窗体监听适配器,窗体退出功能
public void windowClosing(WindowEvent e){//窗体事件
System.out.println("窗体退出");
System.exit(0);
}
});
but.addActionListener(new ActionListener(){//接口型内部类,按钮活动监听
private int signal = 1; //该监听器的按钮使用鼠标和键盘都可以操作
public void actionPerformed(ActionEvent e){
System.out.println("ActionListener:"+signal++);
}
});
but.addMouseListener(new MouseAdapter(){//鼠标监听适配器,按钮监听,
private int count = 1;
private int flag = 1;
public void mouseEntered(MouseEvent e){//鼠标进入事件
System.out.println("鼠标进入按钮:"+count++);
}
public void mouseClicked(MouseEvent e){//点击鼠标事件
if(e.getClickCount()==2) //鼠标动作,双击时触发
System.out.println("双击鼠标:"+flag++);
}
});
}
ActionListener事件监听可以对鼠标和键盘事件都做出反馈;MouseListener 鼠标监听只监听鼠标事件
如果一个按钮上同时具备Action和Mouse两个监听器,一般来说会先执行鼠标监听器,因为它的动作更具体
但是偶尔也会有先执行Action的情况;运行结果如下左图:
鼠标监听可以根据鼠标事件的动作来决定,例如可以设置每次操作点击鼠标次数来决定反应,运行结果如下右图:
键盘事件:
使用Component中方法void addKeyListener(KeyListener l)添加针对键盘事件的监听器,使用KeyListener接口及其适配器,使用KeyEvent控制规则
给按钮添加一个键盘监听
but.addKeyListener(new KeyAdapter(){//给but添加一个键盘监听
public void keyPressed(KeyEvent e){
if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)//规则:组合键Ctrl+Enter时触发
sop("Ctrl+Enter");
// System.exit(0);
// sop(KeyEvent.getKeyText(e.getKeyCode())+" : "+e.getKeyCode());//输出键盘上对应键的 名称+值
}
});
文本组件中的键盘监听
//构造初始化:
TextField tf = new TextField(10);//创建文本框,长度为10
f.add(tf);//添加文本框
//在myEvent()中添加监听器:
tf.addKeyListener(new KeyAdapter(){//给tf文本框添加键盘监听
public void keyPressed(KeyEvent e){
int code = e.getKeyCode();
if(!(code>=KeyEvent.VK_0 && code<=KeyEvent.VK_9)){//
sop("非法数值!");
e.consume();//一旦满足条件,不使用默认的执行
}
}
});
Dialog对话框:
在触发某一事件时弹出对话框提醒用户
创建时需要关联窗体,方法与窗体类似可以添加按钮,设置标签Label,通过setVisible(boolean b);来控制弹出和消失
菜单
继承体系如图:
MenuBar,Menu,MenuItem
先创建菜单条,再创建菜单,每一个菜单中建立菜单项。
也可以菜单添加到菜单中,作为子菜单。
通过setMenuBar()方法,将菜单添加到Frame中。
详细用法参见API及后续练习