GUI
概述:Graphical User Interface(图形用户接口) 用图形的方式,来显示计算机操作的界面,这样更方便更直观。
Java为GUI提供的对象都存在java.Awt和 javax.Swing包中;
awt和swing:
ava.awt:Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。
属重量级控件。
javax.swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性。
属轻量级控件。
Awt中继承关系图:
布局管理器
所谓的布局,就是容器中的组件的排放方式。
常见的布局管理器:
FlowLayout(流式布局管理器)
它是Panel默认的布局管理器。从左到右顺序排列。
BorderLayout(边界布局管理器)
它是Frame默认的布局管理器。 东南西北中的排列方式。
GridLayout(网格布局管理器) 规矩的矩阵。
GridBagLayout(网格包布局管理器) 非规矩的矩阵。
CardLayout(卡片布局管理器) 选项卡。
创建一个简单的窗体:
Container常用子类:Window Panel(面板,不能单独存在。)
Window常用子类:Frame Dialog
创建过程:
1、创建Frame窗体
例:Frame f = new Frame(“我的第一个窗体”); //可设置标题,就是窗口的名字
注意:这时候创建的窗体是不可见的,下面会学习如何让窗口变得可见。
2、设置窗体属性
窗体的属性有好多,下面我列举一些我用过的,来帮助理解:
void setTitle(String title) 给窗体设置标题
void setSize(int width,int height)
设置组件的大小,使其宽度为width
,高度为height
void setVisible(boolean b)
设置窗体是否可见。 根据参数 b
的值显示或隐藏此 Window
。
void setBounds(int x,int y,int width,int height)
移动组件并调整其大小
void setFont(Font f) 设置此容器的字体
void setLayout(LayoutManager mgr) 设置此容器的字体
3. 定义组件
例:Button b =new Button(“按钮”); //定义组件对象,可设置组件的名称。
4. 将组建通过窗体的add方式添加到窗体中。
例:f.add(b); //将刚刚定义的按钮组建添加到窗体中。
5. 让窗体显示
void setVisible(boolean b) 使窗体可见
例:f.setVisible(true);
练习如下:/**
* 步骤:
* 1、创建Frame窗体
* 2、对窗体属性进行设置
* 3、定义组件
* 4、将组件添加到窗体中
* 5、让窗体显示
*/
public class FrameDemo {
public static void main(String[] args) {
//创建Frame对象
Frame f=new Frame();
//定义窗体大小
f.setSize(400, 350);
//设置窗台位置
f.setLocation(200,200);
//设置窗体名
f.setTitle("我的第一个简单的窗体");
//指定布局管理器 网格布局
f.setLayout(new FlowLayout());
//定义并添加组件
Button btn=new Button("非诚勿点!");
f.add(btn);
//设置窗体可见
f.setVisible(true);
}
}
运行后如下:
在上面这个程序中,我们虽然运行后显示出了窗体,但是发现不能关闭,还有就是点击上面那个按钮,发现不起作用,如果想让它们实现某些我们想要的功能,那么就要用到接下来需要介绍的知识点,事件监听机制。
事件监听机制:
A:事件源---就是将来事件发生的那个组件(就是awt包和swing包中的那些图形界面组件)
B:事件---就是要发生的事情。
C:事件监听---就是把事件注册到事件源上,让事件和事件源产生关联(将可以触发某一个事件的动作(不只一个动作)都封装在监听器中)
以上三者在java中都已定义好,直接获取其对象来用即可。
而我们要做的就是对产生的动作进行处理
D:事件处理---就是针对发生的事情的处理结果。
举个通俗的例子来帮助理解:
张三上课迟到了。
事件源:张三
事 件:迟到了
导致张三上课迟到的原因有好多,而针对不同的原因老师对他的惩罚也不一样。
但是,不管什么原因导致的上课迟到,反正是迟到了。
一般来说,事件是一个接口。是要发生的问题,但是没有明确的处理。
事件监听机制流程图:
要关闭窗口可以使用 java.awt.window类中的方法
void addWindowListener(WindowLIstener L) 添加指定的窗口监听器,以窗口接收窗口事件。
但是,从上面可以看到,这个方法接受的参数类型WindowListener是一个接口类型的参数,创建子类对象的话,就会复写其中所有的方法 , 但是我们只用到了一个关闭窗口方法。
所以这时就要使用WindowAdapter类,它是WindowListener的子类已经实现了该接口,并覆盖了其中所有的方法,那么只要继承 WindowAdapter类,并覆盖所需的方法即可。
// 创建窗体对象
Frame f = new Frame();
// 设置窗体属性
f.setTitle("关闭窗口");
f.setSize(400, 300);
f.setLocation(400, 200);
// 用适配器类
f.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
WindowAdapter中用得较多的几个方法:
1. void windowClosing(WindowEvent e) 窗口正处于关闭过程中调用
2. void windowActivated(WindowEvext e) 激活窗口时调用。
3. void windowOpend(WindowEvent e) 一打开窗口时调用。
其中WindowEvent为事件对象。下面从一个案例中来更加深入的应用一下刚才学的知识吧~~
/**
* 需求:把文本框中的内容通过按钮点击显示在文本区域内
* 思路:1、创建窗体对象
* 2、设置窗体属性
* 3、创建文本框,按钮,文本域对象并添加到窗体中
* 4、注册事件
* 5、显示窗体
*/
public class MyText {
public static void main(String[] args) {
//创建窗体对象
Frame f=new Frame();
//设置窗体属性
f.setTitle("文件组件");
f.setSize(400,300);
f.setLocation(400, 200);
f.setLayout(new FlowLayout());
//创建文本框,按钮,文本域对象并添加到窗体中
final TextField tf=new TextField(20);
Button btn=new Button("转到");
final TextArea ta=new TextArea(12,40);
//将它们添加到窗体中
f.add(tf);
f.add(btn);
f.add(ta);
//注册事件
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent arg0) {
System.exit(0);
}
});
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
//获取文本框的值
String tf_str=tf.getText();
//清空操作
tf.setText("");
//赋值给文本域
ta.append(tf_str+"\r\n");
}
});
//显示窗体
f.setVisible(true);
}
}
运行后显示为:
菜单Menu
先介绍下菜单体系:
MenuBar菜单栏 添加菜单和菜单条目。一般先创建菜单栏,再创建菜单。
Menu 菜单 继承MenuItem;有右三角的图标存在,可添加Menu和MenuItem
MenuItem 菜单项 无右三角的图标存在,是最终的菜单项。
菜单栏上可以添加菜单,而每个菜单又可以添加菜单项。每个菜单项其实也可以是一个菜单
在这儿需要注意的是:
菜单栏和Frame的结合是通过Frame的setMenuBar方法
下面是菜单继承体系:
菜单的事件处理和组件一样,可以对类型为MenuItem和Menu的对象事件源添加活动监听ActionListener,并进行相关的事件处理。
通过setMenuBar()方法,将菜单添加到Frame中。
其实理论讲再详细,都不如拿一个实例来看,这样更容易理解。有时候特想多写点例子,又怕老师误以为懒省事,嘿嘿~~~
下面是一个综合练习:
/*
* 需求:创建一个窗体,里面有菜单 菜单栏 菜单项 点击相应菜单,及菜单项,实现其功能。
* 菜单栏:MenuBar
* 菜单 Menu
* 菜单
* 菜单项
* 菜单项 MenuItem
* 1个Frame
* 1个MenuBar
* 2个Menu
* 5个MenuItem
*/
public class MyMenu {
public static void main(String[] args) {
//创建窗体
final Frame fr=new Frame();
//设置窗体属性
fr.setTitle("多级菜单");
fr.setLocation(300,300);
fr.setSize(400,300);
final String name=fr.getTitle();
//创建菜单、菜单栏、菜单项的对象 并添加
MenuBar mb=new MenuBar();
Menu m1=new Menu("文件");
Menu m2=new Menu("更改标题");
final MenuItem mi1=new MenuItem("好好学习");
final MenuItem mi2=new MenuItem("天天向上");
MenuItem mi3=new MenuItem("恢复标题");
MenuItem mi4=new MenuItem("退出系统");
MenuItem mi5=new MenuItem("打开记事本");
//在这儿一定要注意是谁添加谁
m2.add(mi1);
m2.add(mi2);
m2.add(mi3);
m1.add(m2);
m1.add(mi4);
m1.add(mi5);
mb.add(m1);
fr.setMenuBar(mb);
fr.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
mi4.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
System.exit(0);
}
});
mi5.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//打开系统的记事本
Runtime r=Runtime.getRuntime();
try {
r.exec("notepad");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
mi1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fr.setTitle(mi1.getLabel());
}
});
mi2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fr.setTitle(mi2.getLabel());
}
});
mi3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fr.setTitle(name);
}
});
// 设置窗体可见
fr.setVisible(true);
}
}
下面是运行结果:
点开之后:
小小发泄一下:这个图好难截啊,点开后,一点截图就没了,无奈只能手机拍一张再传到电脑上,然后在截图了,呜呜呜呜~~~~
到此,GUI的所有知识点儿就先总结到这儿啦,有些理解的不对的地方,真诚地希望大家帮我指正出来,谢谢!!!