GUI是图形化用户界面,实际包含AWT(抽象窗口工具)技术和swing技术,AWT是一种重量级可视化的窗口,swing是轻量级可视化窗口,AWT之所以被称为重量级可视化页面技术,是因为用AWT所做的页面,其实是java是借用虚拟机所在的视窗操作系统的页面来作为自己的页面,即它不是利用java虚拟机自己内部的页面,而是借用底层视窗化操作系统的视窗,并且它所产生的页面开辟和消亡都比较慢,并且是不稳定的;而swing基本使用java虚拟机内部自己生成,自己消亡的,是虚拟机内部自己生成的页面,它只有极小的一部分是以AWT为基础的,所以更加稳定。下面是AWT包含的内容的图和swing包含的内容的图。
下面是swing的类结构图:
其中右边红色部分是swing中利用java虚拟机内部产生的页面类对象,左下角是依赖AWT产生的页面类对象。
在介绍swing之前,我们必须了解MVC是什么:
MVC(视图可控制化模型),它并不是一种技术,是一种模型,框架,是一个程序设计思想,是将视图,控制和持久层数据存储分开为三层,视图层是与用户直接交互,负责用户数据的收集和展示用户的查询服务结果;控制层负责业务逻辑的分发和流程的转发,通俗的来说,就是将数据分发给哪个对象去处理(structs就是控制层的一种实现技术);持久层就是负责将数据存储起来。从持久层到视图(展示)层,就是“推”,展示层的改变表现为被动就是推,而展示层主动发生改变,从展示层到持久层的方向就是“拉”。swing就是运用的MVC的推,而平时做的项目基本都是MVC的拉。
mvc框架中的model层可以细分为两层,即JDBC层和实体entity层,JDBC层用来连接数据库以及写最基础的sql语句进行增删改查,实体层是数据库表在内存中的映射,它相当于一个缓冲区一样,由上层来的数据被暂存在实体层,一旦要断电,那么该层的数据就会被写入数据库中进行保存。它的类的属性就是表中的字段,类的方法就是构造函数,get和set方法,hashcode()和equals()方法以及toString()方法,有多少个数据库表,我们就需要写多少个entity类,它是数据库一张表中的字段封装成类的属性。
java中的逻辑三层就分为数据层,对象层以及介于数据层与对象层之间的DAO(数据访问对象层),DAO向上是对象层,向下是数据层(数据库),这样就将对象与数据分开来,程序员在编程时就只需要关心对象,只写业务逻辑就可以。例如数据库框架Hibernate就是将DAO以及数据层封装起来。DAO实际是对象化的数据的增删改查,这时一般需要写一个接口,向上层提供增删改查的各种方式,当然DAO下也需要一个类来实现接口的方法。
swing的优势在于轻量级的组件,可改变的外观,运用MVC的程序设计思想以及运行更加稳定。
下面我们来介绍swing的相关组件。
代码如下:
package com.example.Test1;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Panel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JViewport;
public class swingTest1 {
private JFrame frame=null;
private JPanel panel1=null;
private JPanel panel2=null;
private JPanel panel3=null;
private JLabel label1=null;
private JButton button=null;
private JTextField field=null;
private JPasswordField passwordField=null;
private JTextArea textArea=null;
private JScrollPane jScrollPane=null;
private FlowLayout flowLayout=null; private JButton button1=null;
private JButton button2=null;
private JButton button3=null;
private JButton button4=null;
private JButton button5=null;
BorderLayout borderLayout=null;
public void init(){
this.frame=new JFrame("Mytest1");
this.frame.setLayout(new GridLayout(1,3));//三种布局管理器之一
Container container=this.frame.getContentPane(); //将Jpanel加入其下层的Jframe,必须要先获得下层的一个中间层内容层
this.panel1=new JPanel();//这里使用的是默认的布局管理器
this.flowLayout=new FlowLayout(FlowLayout.LEFT,20,30);//相当于下面四条代码
this.flowLayout=new FlowLayout();//创建流水布局管理器(默认也是该布局管理器)
flowLayout.setAlignment(FlowLayout.LEFT);//组件左对齐
flowLayout.setHgap(20);//设置组件之间水平间距
flowLayout.setVgap(30);//设置组件之间竖直间距
this.panel1.setLayout(flowLayout);//将默认的流水布局管理器加入到panel1“桌布”上
this.panel1.setBackground(Color.BLUE);
this.label1=new JLabel("i am labal1",new ImageIcon("./img/qq.png"),JLabel.CENTER);
this.label1.setFont(new Font("幼圆", Font.BOLD, 16));//设置文字字体,形状及大小
this.label1.setForeground(Color.WHITE);//设置文字的颜色
this.label1.setVerticalTextPosition(JLabel.BOTTOM);
this.label1.setHorizontalTextPosition(JLabel.CENTER);//设置使文字在文本标签下面
this.panel1.add(this.label1);
this.button=new JButton("i am button",new ImageIcon("./img/qq.png"));
this.button.setVerticalTextPosition(JButton.BOTTOM);
this.button.setHorizontalTextPosition(JButton.CENTER);//设置使文字在文本标签下面
this.panel1.add(this.button);
this.field=new JTextField(16); //文本编辑框
this.panel1.add(this.field);
this.passwordField=new JPasswordField(16);
this.panel1.add(this.passwordField);
this.textArea=new JTextArea("shuo ming wen zi",10,16);
this.jScrollPane=new JScrollPane(this.textArea);//与下面三句相当,该参数会被直接放入JViewport中
this.jScrollPane=new JScrollPane();
JViewport viewport=this.jScrollPane.getViewport();//要加文本区域,必须将其加入JViewport中才能进行滚动
viewport.add(this.textArea);
this.panel1.add(jScrollPane);
container.add(panel1);//将panel1加入下层的JFrame
this.panel2=new JPanel();
this.panel2.setBackground(Color.RED);
this.borderLayout=new BorderLayout(2, 2);//创建 BorderLayout布局管理器,参数为水平宽度和竖直高度
this.panel2.setLayout(borderLayout);//将布局管理器设置为 BorderLayout布局管理器
this.button1=new JButton("1");
this.button2=new JButton("2");
this.button3=new JButton("3");
this.button4=new JButton("4");
this.button5=new JButton("5");
this.panel2.add(button1, BorderLayout.CENTER);
this.panel2.add(button2, BorderLayout.NORTH);
this.panel2.add(button3, BorderLayout.SOUTH);
this.panel2.add(button4, BorderLayout.WEST);
this.panel2.add(button5, BorderLayout.EAST);
container.add(panel2);
this.panel3=new JPanel(new GridLayout(2,2));//设置格子布局管理器
this.panel3.add(button1);
this.panel3.add(button2);
this.panel3.add(button3);
this.panel3.add(button4);
this.panel3.add(button5);//由于格子布局管理器设为2x2,所以如果没有此句,则正好填满,若有此句,在自动容错,将布局管理器改为2x3
container.add(panel3);
//this.frame.setBounds(100,100,400,600);//设置其“桌子”的大小及窗口弹出的坐标位置
this.frame.setSize(400,600); //设置其“桌子”的大小
//this.frame.pack();//pack翻译为自适应,是默认“桌子”大小填充满里面的组件
this.frame.setLocation(100,100);//设置窗口弹出的坐标位置
this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置使其关闭窗口时,程序结束运行
this.frame.setVisible(true);//使窗口可视化
}
public swingTest1(){
this.init();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
swingTest1 swingTest= new swingTest1();
}
}
三种布局管理器为FlowLayou,GridLayout和BorderLayout,其中BorderLayout是将布局分为上下左右中五部分,其实是东南西北中五部分,上北下南,左西右东,南北直通到边,东西则不含矩形四角,剩下的只有中心。