一、gui概述
gui:
graphical user interface图形用户接口。
用图形的方式,来显示计算机操作的界面,这样更方便更直观。
cli:
command line user interface命令行用户接口
就是常见的dos命令行操作,需要记住一些常用的命令,操作不直观。
java为gui提供的对象都存在java.awt和javax.swing两个包中。
二、awt和swing包的概述
java.awt:abstract window toolkit抽象窗口工具包,需要调用本地系统方法实现功能,属于重量级控件。
javax.swing:在awt的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全有java实现,增强了移植性,属于轻量级控件。
三、gui继承体系
container:为容器,是一个特殊的组件,该组件中可以通过add方法添加其他组件进来。
package cn5;
import java.awt.frame;
/**
* 创建一个最简单的窗体
*/
public class awtdemo {
public static void main(string[] args) {
//创建一个最初不可见的窗体对象
frame f = new frame();
//设置窗体标题
f.settitle("哈哈 呵呵 嘻嘻 笨笨");
//设置窗体大小
f.setsize(400, 300);//单位:默认像素
//设置窗体坐标
f.setlocation(400, 200);
//让窗体可见
f.setvisible(true);
}
}
其他方法实现上图的效果
package cn5;
import java.awt.dimension;
import java.awt.frame;
import java.awt.point;
public class awtdemo2 {
public static void main(string[] args) {
//创建一个不可见的窗体
frame f = new frame();
//设置标题
f.settitle("哈哈");
//设置位置
f.setlocation(new point(400, 200));
//设置大小
f.setsize(new dimension(400, 300));
//使得窗体可见
f.setvisible(true);
}
}
package cn5;
import java.awt.frame;
public class awtdemo2 {
public static void main(string[] args) {
//创建一个不可见的窗体
frame f = new frame();
//设置标题
f.settitle("哈哈");
f.setbounds(400,200,400,300);
//使得窗体可见
f.setvisible(true);
}
}
实现窗体关闭
package cn5;
import java.awt.frame;
import java.awt.event.windowevent;
import java.awt.event.windowlistener;
/**
* 事件监听机制
* 事件源:事件发生的地方。
* 事件:就是要发生的事情。
* 事件处理:就是针对发生的事情做出的处理方案。
* 事件监听:就是把事件源和事件关联起来。
*
* 举例:人受伤事件
* 事件源:人(具体的对象)
* person p1 = new person("张三");
* person p2 = new person("李四");
* 事件:受伤
* interface 受伤接口{
* 一拳();
* 一脚();
* 一板砖();
* }
* 事件处理:
* 事件处理类 implements 受伤接口{
* 一拳(){
* system.out.println("鼻子流血了,去医院");
* }
* 一脚(){
* system.out.println("晕倒了");
* }
* 一板砖(){
* system.out.println("头破血流");
* }
* }
* 事件监听:
* p1.注册监听(受伤接口)
* p2.注册监听(受伤接口)
*/
public class awtdemo3 {
public static void main(string[] args) {
//创建一个最初不可见的窗体对象
frame f = new frame("窗体关闭");
//设置窗体属性
f.setbounds(400, 200, 400, 300);
//让窗体关闭
//事件源:窗体f
//事件:对窗体的处理
//事件处理:关闭窗体(system.exit(0))
//事件监听:
f.addwindowlistener(new windowlistener() {
@override
public void windowopened(windowevent e) {
}
@override
public void windowiconified(windowevent e) {
}
@override
public void windowdeiconified(windowevent e) {
}
@override
public void windowdeactivated(windowevent e) {
}
@override
public void windowclosing(windowevent e) {
system.exit(0);
}
@override
public void windowclosed(windowevent e) {
}
@override
public void windowactivated(windowevent e) {
}
});
//使得窗体可见
f.setvisible(true);
}
}
按照上面的代码,是不是有很多多余的代码,为啥子?且看下面分解。
四、适配器模式
package cn6;
public interface iuserdao {
/**
* 增加用户
*/
public void add();
/**
* 删除用户
*/
public void delete();
/**
* 修改用户
*/
public void update();
/**
* 查询用户
*/
public void find();
}
package cn6;
public class userdaoimpl implements iuserdao {
@override
public void add() {
system.out.println("用户增加");
}
@override
public void delete() {
system.out.println("用户删除");
}
@override
public void update() {
system.out.println("用户修改");
}
@override
public void find() {
system.out.println("用户查询");
}
}
package cn6;
public class test {
public static void main(string[] args) {
iuserdao userdao = new userdaoimpl();
userdao.add();
userdao.delete();
userdao.find();
userdao.update();
}
}
用户增加
用户删除
用户查询
用户修改
但是如果我只想要用户增加功能,此时,你会想,我不调用delete(),find()和update()方法不就可以了吗?
package cn6;
public interface iuserdao {
/**
* 增加用户
*/
public void add();
/**
* 删除用户
*/
public void delete();
/**
* 修改用户
*/
public void update();
/**
* 查询用户
*/
public void find();
}
package cn6;
public class userdaoimpl implements iuserdao {
@override
public void add() {
system.out.println("用户增加");
}
@override
public void delete() {
system.out.println("用户删除");
}
@override
public void update() {
system.out.println("用户修改");
}
@override
public void find() {
system.out.println("用户查询");
}
}
package cn6;
public class test {
public static void main(string[] args) {
iuserdao userdao = new userdaoimpl();
userdao.add();
}
}
是的,但是,你在接口的实现类中是不是还要重写接口中定义的方法,即使你不写具体实现。但是,老子就是讨厌写很多多余的代码,我有洁癖,你拿我怎么办?
哼哼,在接口和具体的实现类之间加一个抽象类(适配器类)。
接口--适配器(抽象类)--具体实现类
package cn6;
public interface iuserdao {
/**
* 增加用户
*/
public void add();
/**
* 删除用户
*/
public void delete();
/**
* 修改用户
*/
public void update();
/**
* 查询用户
*/
public void find();
}
package cn6;
public abstract class useradapter implements iuserdao {
@override
public void add() {
}
@override
public void delete() {
}
@override
public void update() {
}
@override
public void find() {
}
}
package cn6;
public class userdaoaddimpl extends useradapter {
@override
public void add() {
system.out.println("用户添加");
}
}
注意:如果此时在userdaoaddimpl类中不写任何方法,是不会报错了,因为抽象类useradapter已经实现了接口,虽然仅仅都是空实现而已。
package cn6;
public class userdaoaddimpl extends useradapter {
}
但是因为我只想要用户增加功能,所以呢?我就写了一个类来实现用户增加功能啦,这样是不是很省事,这样我就不用再去实现4个方法了。
package cn6;
public class userdaoaddimpl extends useradapter {
@override
public void add() {
system.out.println("用户增加");
}
}
如果我现在只想要用户删除功能,我就写一个类来实现用户删除的功能就可以了,当然必须继承这个抽象类了。
package cn6;
public class userdaodeleteimpl extends useradapter {
@override
public void delete() {
system.out.println("用户删除");
}
}
其它的,依次类推即可。
package cn6;
public class test {
public static void main(string[] args) {
//用户增加
iuserdao userdao = new userdaoaddimpl();
userdao.add();
//用户删除
userdao = new userdaodeleteimpl();
userdao.delete();
}
}
但是看到这边,你可以觉得好像很刚开始那种没什么两样。
package cn6;
public class userdaoimpl implements iuserdao {
@override
public void add() {
system.out.println("用户增加");
}
@override
public void delete() {
system.out.println("用户删除");
}
@override
public void update() {
system.out.println("用户修改");
}
@override
public void find() {
system.out.println("用户查询");
}
}
但是,实际却不是如此,上面的这个代码产生了很多垃圾代码,因为我就只要要用户增加功能,而你却实现了用户增加、用户删除等等,这个时候,你可能会想,我去,你想要用户增加功能是吧,可以。看下面的代码。
package cn6;
public class userdaoimpl implements iuserdao {
@override
public void add() {
system.out.println("用户增加");
}
@override
public void delete() {
}
@override
public void update() {
}
@override
public void find() {
}
}
但是,老子现在想要用户增加和用户修改的功能,这个你就郁闷了,又要修改代码,是不是很烦,没办法,顾客就是小白,顾客的需求总是在变化,我们能做的就是以不变应万变。所以,如果采用适配器模式,你想怎么改变需求,可以,老子,就给你创建一个满足你功能的实现类,这样你无话可说了吧。
【注意】如果接口中的功能就只要一个,就没有必要使用适配器模式,用了,和没用有区别吗?
五、运用适配器模式解决窗口关闭的多余代码
package cn5;
import java.awt.frame;
import java.awt.event.windowadapter;
import java.awt.event.windowevent;
import java.awt.event.windowlistener;
/**
* 事件监听机制
* 事件源:事件发生的地方。
* 事件:就是要发生的事情。
* 事件处理:就是针对发生的事情做出的处理方案。
* 事件监听:就是把事件源和事件关联起来。
*
* 举例:人受伤事件
* 事件源:人(具体的对象)
* person p1 = new person("张三");
* person p2 = new person("李四");
* 事件:受伤
* interface 受伤接口{
* 一拳();
* 一脚();
* 一板砖();
* }
* 事件处理:
* 事件处理类 implements 受伤接口{
* 一拳(){
* system.out.println("鼻子流血了,去医院");
* }
* 一脚(){
* system.out.println("晕倒了");
* }
* 一板砖(){
* system.out.println("头破血流");
* }
* }
* 事件监听:
* p1.注册监听(受伤接口)
* p2.注册监听(受伤接口)
*/
public class awtdemo3 {
public static void main(string[] args) {
//创建一个最初不可见的窗体对象
frame f = new frame("窗体关闭");
//设置窗体属性
f.setbounds(400, 200, 400, 300);
//让窗体关闭
//事件源:窗体f
//事件:对窗体的处理
//事件处理:关闭窗体(system.exit(0))
//事件监听:
f.addwindowlistener(new windowadapter() {
@override
public void windowclosing(windowevent e) {
system.exit(0);
}
});
//使得窗体可见
f.setvisible(true);
}
}
六、把按钮添加到窗体,并添加点击事件
package cn7;
import java.awt.button;
import java.awt.frame;
import java.awt.event.windowadapter;
import java.awt.event.windowevent;
/**
* 需求:把按钮添加到窗体,并对按钮添加一个点击事件
* 1.创建窗体对象
* 2.创建按钮对象
* 3.把按钮添加到窗体
* 4.窗体显示
*
*/
public class awtdemo {
public static void main(string[] args) {
//创建窗体对象
frame f = new frame("把按钮添加到窗体,并对按钮添加一个点击事件");
//设置窗体属性
f.setbounds(400, 200, 400, 300);
//创建按钮对象
button button = new button("我是按钮");
button.setsize(20,10);
//把按钮添加到窗体
f.add(button);
//设置窗体可以关闭
f.addwindowlistener(new windowadapter() {
@override
public void windowclosing(windowevent e) {
system.exit(0);
}
});
//窗体显示
f.setvisible(true);
}
}
丑的我都吃不下饭了,哪有按钮这么大的,而且我设置了按钮的大小了,但是怎么不起作用呢?
package cn7;
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;
/**
* 需求:把按钮添加到窗体,并对按钮添加一个点击事件
* 1.创建窗体对象
* 2.创建按钮对象
* 3.把按钮添加到窗体
* 4.窗体显示
*
*/
public class awtdemo {
public static void main(string[] args) {
//创建窗体对象
frame f = new frame("把按钮添加到窗体,并对按钮添加一个点击事件");
//设置窗体属性
f.setbounds(400, 200, 400, 300);
//创建按钮对象
button button = new button("我是按钮");
//设置点击事件
button.addactionlistener(new actionlistener() {
@override
public void actionperformed(actionevent e) {
system.out.println("你再看试试");
}
});
//frame的布局默认是边界布局,现在修改为流式布局
f.setlayout(new flowlayout());
//把按钮添加到窗体
f.add(button);
//设置窗体可以关闭
f.addwindowlistener(new windowadapter() {
@override
public void windowclosing(windowevent e) {
system.exit(0);
}
});
//窗体显示
f.setvisible(true);
}
}
七、练习
package cn8;
import java.awt.button;
import java.awt.flowlayout;
import java.awt.frame;
import java.awt.textarea;
import java.awt.textfield;
import java.awt.event.actionevent;
import java.awt.event.actionlistener;
import java.awt.event.windowadapter;
import java.awt.event.windowevent;
public class awtdemo {
public static void main(string[] args) {
//创建窗体对象
frame f = new frame("数据转移");
//设置窗体属性
f.setbounds(400, 200, 400, 300);
//设置窗体布局
f.setlayout(new flowlayout());
//创建文本框
final textfield tf = new textfield(20);
//创建按钮
button bt = new button("数据转移");
//创建文本域
final textarea tx = new textarea(10,40);
//把组件添加到窗体
f.add(tf);
f.add(bt);
f.add(tx);
//设置关闭事件
f.addwindowlistener(new windowadapter() {
@override
public void windowclosing(windowevent e) {
system.exit(0);
}
});
//对按钮添加事件
bt.addactionlistener(new actionlistener() {
@override
public void actionperformed(actionevent e) {
//获取文本框的值
string tf_str = tf.gettext().trim();
//清空数据
tf.settext("");
//设置给文本库并换行
tx.append(tf_str+"\r\n");
//文本框获取光标
tf.requestfocus();
}
});
//让窗体显示
f.setvisible(true);
}
}
package cn9;
/**
*鼠标点击事件
*/
import java.awt.button;
import java.awt.color;
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 awtdemo {
public static void main(string[] args) {
final frame f = new frame("更改背景色");
f.setbounds(400, 200, 400, 300);
f.setlayout(new flowlayout());
//创建按钮
button bt1 = new button("红色");
button bt2 = new button("黑色");
button bt3 = new button("绿色");
button bt4 = new button("黄色");
//添加按钮
f.add(bt1);
f.add(bt2);
f.add(bt3);
f.add(bt4);
f.addwindowlistener(new windowadapter() {
@override
public void windowclosing(windowevent e) {
system.exit(0);
}
});
bt1.addactionlistener(new actionlistener() {
@override
public void actionperformed(actionevent e) {
f.setbackground(color.red);
}
});
bt2.addactionlistener(new actionlistener() {
@override
public void actionperformed(actionevent e) {
f.setbackground(color.black);
}
});
bt3.addactionlistener(new actionlistener() {
@override
public void actionperformed(actionevent e) {
f.setbackground(color.green);
}
});
bt4.addactionlistener(new actionlistener() {
@override
public void actionperformed(actionevent e) {
f.setbackground(color.yellow);
}
});
f.setvisible(true);
}
}
package cn9;
import java.awt.button;
import java.awt.color;
import java.awt.flowlayout;
import java.awt.frame;
import java.awt.event.mouseadapter;
import java.awt.event.mouseevent;
import java.awt.event.windowadapter;
import java.awt.event.windowevent;
/**
* 鼠标移动事件
*/
public class awtdemo {
public static void main(string[] args) {
final frame f = new frame("更改背景色");
f.setbounds(400, 200, 400, 300);
f.setlayout(new flowlayout());
//创建按钮
button bt1 = new button("红色");
button bt2 = new button("黑色");
button bt3 = new button("绿色");
button bt4 = new button("黄色");
//添加按钮
f.add(bt1);
f.add(bt2);
f.add(bt3);
f.add(bt4);
f.addwindowlistener(new windowadapter() {
@override
public void windowclosing(windowevent e) {
system.exit(0);
}
});
bt1.addmouselistener(new mouseadapter() {
@override
public void mouseentered(mouseevent e) {
f.setbackground(color.red);
}
});
bt2.addmouselistener(new mouseadapter() {
@override
public void mouseentered(mouseevent e) {
f.setbackground(color.black);
}
});
bt3.addmouselistener(new mouseadapter() {
@override
public void mouseentered(mouseevent e) {
f.setbackground(color.green);
}
});
bt4.addmouselistener(new mouseadapter() {
@override
public void mouseentered(mouseevent e) {
f.setbackground(color.yellow);
}
});
f.setvisible(true);
}
}
package cn10;
import java.awt.flowlayout;
import java.awt.frame;
import java.awt.label;
import java.awt.textfield;
import java.awt.event.keyadapter;
import java.awt.event.keyevent;
import java.awt.event.windowadapter;
import java.awt.event.windowevent;
public class awtdemo {
public static void main(string[] args) {
frame f = new frame("qq校验");
f.setbounds(400, 200, 400, 300);
f.setlayout(new flowlayout());
label l = new label("请输入你的qq号码,不能是非数字");
textfield tf = new textfield(30);
f.add(l);
f.add(tf);
tf.addkeylistener(new keyadapter() {
@override
public void keypressed(keyevent e) {
char c = e.getkeychar();
if(!(c >= '0' && c <='9')){
e.consume();
}
}
});
f.addwindowlistener(new windowadapter() {
@override
public void windowclosing(windowevent e) {
system.exit(0);
}
});
f.setvisible(true);
}
}
八、菜单组件
菜单组件概述
menubar,menu,menuitem
先创建菜单条,再创建菜单,每一个菜单中建立菜单项。
也可以菜单添加到菜单中,作为子菜单。
通过setmenubar()方法,将菜单添加到frame中。
package cn11;
import java.awt.frame;
import java.awt.menu;
import java.awt.menubar;
import java.awt.menuitem;
import java.awt.event.actionevent;
import java.awt.event.actionlistener;
import java.awt.event.windowadapter;
import java.awt.event.windowevent;
/**
* 一级菜单
*/
public class demo {
public static void main(string[] args) {
frame f = new frame("一级菜单");
f.setbounds(400, 200, 400, 300);
//创建菜单栏
menubar bar = new menubar();
//创建菜单
menu m = new menu("文件");
//创建菜单项
menuitem mi = new menuitem("退出系统");
//设置菜单栏
f.setmenubar(bar);
bar.add(m);
m.add(mi);
mi.addactionlistener(new actionlistener() {
@override
public void actionperformed(actionevent e) {
system.exit(0);
}
});
f.addwindowlistener(new windowadapter() {
@override
public void windowclosing(windowevent e) {
system.exit(0);
}
});
f.setvisible(true);
}
}
