Java中的图像化界面----Awt与Swing
GUI全称Graphical User Interfaces(图形用户户界面),又称为图形用户接口。GUI指的就是采用图形方式显示的计算机操作用户界面,所谓的用户界面通俗的来讲也就是在桌面上我们看到的小型窗口。
微信聊天窗口就是一个用户图形化界面,但是现在大多数的用户图形化界面并不使用Java语言来实现,虽然Java可以实现图像化界面,但是由于其整体美感较差,而且使用效率相比其他语言要低,它并是实现图形化界面的最优解,因此使用较少。
Java中的GUI主要通过java.awt和javax.swing来进行实现。
AWT:abstract window toolkit(抽象窗口工具集),它是一种重量级组件,比较依赖于本地操作系统的GUI,缺乏平台独立性。但是其中组件较稳稳定,兼容每一个JDK版本。java.awt中的类负责于本地操作系统进行交互,让本地操作系统显示和操作组件,因此所有的组件都是以Java.awt为基类。
Swing:无缩写,本意为摆渡,摆动,意味这人机之间的交互过度。自JDK1.2版本进行引入,是对AWT组建的一个拓展,功能更强,界面更丰富,各种平台上更统一,它是轻量级的(lightweight,即all-Java language) 。
一、浅析Java Awt、Java Swing
实现GUI编程三个必不可少的要素:组件、布局管理、事件。通过这三个方面来浅析Java awt如何实现的GUI编程
设计和实现用户图形化界面可以分解为三个步骤:
- 创建组件:创建组成界面的各种元素,如:文本框、按钮、窗口(frame)等。
- 指定布局:根据具体需要设置它们的排列位置,三种布局管理方式(流式布局、网格布局、边界布局方式) 。
- 相应事件:定义图形用户界面的事件和各界面元素对不同事件的响应, 从而实现图形用户界面与用户的交互功能。
1、组件
Java中构成图像用户界面的各种元素,称之为组件。组件分为容器类组件和非容器类组件。容器有被分为顶级容器和非顶级容器。
一般来说Java中的所有组件的基类都是java.component,又有容器的基类一般都是container中。Component类是所有组件和容器的抽象父类,其中定义了一些每个容器和组件都可能用到的方法。
Java中组件分为:普通组件、容器(顶级容器、普通容器)。每个容器都具有add方法,这个add方法在container基类中实现,每个继承此类的子类容器都具有添加组件的能力,且组件必须通过添加到容器中方能正常显示。
组件基本应用(包含画笔的使用)
- 两个顶级容器的应用:Frame(窗口)、Dialog(弹窗)
import java.awt.Button;
import java.awt.Color;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Test{
public static void main(String[] args) {
Myframe frame = new Myframe();
frame.init();
frame.compen();
}
}
//创建一个桌面窗口,并在窗口中添加一个按钮组件
class Myframe extends Frame{
private static final long serialVersionUID = -3005332394925719672L;
public Myframe() {
super("测试窗口");
}
//通过设置初始化函数来对此窗口进行初始化
public void init() {
super.setVisible(true);
super.setBounds(200, 200, 200, 200);
//为窗口添加事件,进行关闭操作
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
//为此窗口添加一个组件---按钮组件
public void compen() {
Button button = new Button("按钮");
button.setSize(100, 100);
//设置组件的布局方式
this.setLayout(null);;
this.add(button);
//为按钮主键添加侦听器---侦听器通过内部类实现---接口、继承
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//当侦听到事件后,响应此继承的方法,并执行方法中的语句
//事件产生后,重新创建一个弹窗对象进行显示
end();
}
});
}
public void end() {
new Mydialog(this,"测试弹窗").increase();
}
}
//创建一个弹窗通过监听弹出
class Mydialog extends Dialog{
private static final long serialVersionUID = 1L;
/**
* 添加构造函数,直接通过构造函数对弹窗进行初始化
*/
public Mydialog(Frame owner,String title) {
super(owner,title);
setVisible(true);//方法继承自window类,往往用于顶级窗口,设置窗口是否可见
setSize(100, 200);//继承自window类,用于设置组件的大小
/*
* 继承自window类,用于设置窗口的背景颜色,
* 其需要传入color类对象可以使用color类中的类变量。
*/
setBackground(Color.BLUE);
setLocation(200, 300);//继承自window类,移动组件到指定位置,也就是将组件放到指定位置。以物理机左上角作为原点。
/*setBounds(x, y, width, height);
* 继承自window类,用于移动组件到指定位置,并设定组件的大小。
*/
//为窗口添加事件,进行关闭操作,
//这种内部类不去实现一个接口而是去继承一个类,而这个类实现类所有方法,但是方法体为空,便于以后
//进行使用,这种模式方法叫做适配器模式,大大降低了无效代码的使用。
this.addWindowListener(new WindowAdapter() {
//当事件产生后,系统构造出内部类对象,通过此对象调用,复写的方法
//其中复写中方法中的参数,通过系统产生传入,
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
//向此容器中添加组件---文本框
public void increase() {
Label label = new Label("这是一个文本框",1);
this.add(label);
}
}
测试效果图:
- 画笔的使用
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestGraphics{
/**
* 画笔,此paint()方法以及画笔对象由系统自动产生,进行自动传参,
*当此类继承frame并对paint进行重写后,与此同时这个对象被监听,一旦监听到对象被创建,
*此时,系统将自动调用paint()方法,并创建一个画笔参数传参给他。
*通过此画笔对象调用相应方法,时Java底层进行的回调操作。
*/
public static void main(String[] args) {
new MyPaint().MyFrame();
}
}
class MyPaint extends Frame{
private static final long serialVersionUID = 1L;
/*
* 初始化窗口---对窗口设置可视性、设置窗口侦听器(设置关闭按钮),设置窗口的绝对大小和绝对位置。
*/
public void MyFrame() {
setBounds(100, 100, 300, 300);
setVisible(true);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
/**
* 此paint()方法,继承自window类,一般被其子类frame、dialog进行实现,并仅仅在此两个窗口上进行绘制。
* 当这些子类对象窗口创建,并进行复写方法,系统会自动创建一个画笔,并在此容器组件上进行绘制图形。
* 当组件中的绘图更新时,也可以通过component类中的repaint()进行对组件重画更新界面。
*/
@Override
public void paint(Graphics g) {
// super.print(g);//调用父类的paint()
//为画笔设置颜色
g.setColor(Color.BLUE);
g.drawOval(80, 50, 200, 80);
}
}
2、布局管理器
eclipse中可以通过安装windowbuilder插件,可以New—Other—Windows Builder —Swing Designer—Jframe,其顶部可切换source/design模式,通过design进行可视化布局。
java.awt包中定义了多种布局管理器,这里我们了解五种布局管理器。
- 常用的三种布局管理器、两种非常用布局管理器(CardLayout,