JAVA-UI编程之-AWT界面编程

概要

JAVA中,界面编程从AWT,SWING,SWT,还有为富互联网(RIA)应用的JavaFX。有各自的存在道题。

AWT,最接近系统底层,比较受限系统,目前基本很少直接应用企业开发。但是更因为他接近系统层,性能上相对较高。特别是嵌入式开发的时候。也有一定的采用价值。

SWING,是在AWT的基础上,封装了更多,更适合跨平台的UI类库。目前企业应用开发比较多。因为是JDK集成的。开发的应用体积可以相对较小。

SWT是IBM基于eclipse的方式集成的一套稳定的UI框架。可以方便的开发UI应用。但是打包的应用,需要集成相关的jar包。

JavaFX的出现,是因为Oracle已经认识到了RIA技术的重要性,想把JavaFX打造成Flash和Sliverlight这样的顶级产品。然而目前H5当道。移动互联网时代FX并不是很流行.

 

AWT类关系

好了,回到主题。今天我们温习一下如何纯AWT编程。先看下AWT的几个主要类的关系图

 

这里写图片描述

 

Component组件类下面包含容器类和控件类。容器类包含了窗口,对话框,Panel。控件包含了基础的按钮,文本标签,复选框,文本框等。一些简单的UI应用还是完全能满足的。

 

小例子

来一个简单例子。通过时间和原文,组合后MD5加密密码的例子。主要是showFrame中的添加控件(按钮,文本框,标签文本)

/**
 * 作者:     andy.zhang
 * 创建时间:2018年7月23日 下午4:14:05
 * 作用: 密码的二次加密工具
 */
package pwdtool2;

import java.awt.Button;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.text.ParseException;
import java.util.Date;



/**
 * @author andy
 * @date 2018年7月23日
 */
public class Pwdtool extends Frame implements WindowListener  {



	/**
	 * 
	 */
	private static final long serialVersionUID = -2768217391703339722L;
	
	private static TextField textDate;
	private static TextField txtPwd;
	private static TextField textMd5;
	

     
	public void showFrame(){

        // 为窗口添加表单控件
		
		textDate = new TextField("");
		textDate.setText("2018-01-01 11:11:11");
		textDate.setBounds(62, 30, 197, 41);
		
		txtPwd = new TextField("");
		txtPwd.setText("cocopico123456");
		txtPwd.setBounds(62, 77, 197, 41);
		
		Button btnNewButton = new Button("");
		btnNewButton.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				Date date;
				try {
                    // 此处是具体的处理逻辑。和本文主题没有直接关系
					//date = DateUtils.parseWithDefaultPattern(textDate.getText());
					//String md5=MDEncode.md5Encode(date.getTime()+"\n"+txtPwd.getText());
					textMd5.setText(md5);
					messageBox(md5);
				} catch (ParseException e1) {
					messageBox(e1.getMessage());

					e1.printStackTrace();
				}
				
			}
		});
		btnNewButton.setBounds(265, 75, 103, 43);
		btnNewButton.setLabel("生成加密密码");
		
		textMd5 = new TextField("");
		textMd5.setBounds(62, 124, 306, 37);
		
		Label lblNewLabel = new Label("");
		lblNewLabel.setBounds(10, 30, 32, 38);
		lblNewLabel.setFont(new Font("宋体", 1, 13));
		lblNewLabel.setText("时间");
		
		Label label = new Label("");
		label.setBounds(8, 80, 50, 38);
		label.setFont(new Font("宋体", 1, 13));
		label.setText("原字符");
		
		Label label_1 = new Label("");
		label_1.setBounds(8, 127, 48, 34);
		label_1.setFont(new Font("宋体", 1, 13));
		label_1.setText("加密后");



		this.add(label);
		this.add(label_1);
		this.add(lblNewLabel);
		this.add(textDate);
		this.add(txtPwd);
		this.add(textMd5);
		this.add(btnNewButton);
		
		this.setLayout(null);
		this.setSize(400,200);
		this.setLocation(400, 400);
		this.setVisible(true);
		this.setTitle("COCO密码工具");

		this.addWindowListener(this);

	}
	
	public void messageBox(String msg){
			final Dialog d = new Dialog(this, "提示信息", true);//弹出的对话框
	        d.setBounds(400, 200, 350, 150);//设置弹出对话框的位置和大小
	        d.setLayout(new FlowLayout());//设置弹出对话框的布局为流式布局
	        Label lab = new Label(msg);//创建lab标签填写提示内容
	        Button okBut = new Button("确定");//创建确定按钮

	        d.add(lab);//将标签添加到弹出的对话框内
	        d.add(okBut);//将确定按钮添加到弹出的对话框内。
	        
	     // 确定按钮监听器
	        okBut.addActionListener(new ActionListener() {

	            public void actionPerformed(ActionEvent e) {
	                d.setVisible(false);
	            }

	        });

	        // 对话框监听器
	        d.addWindowListener(new WindowAdapter() {
	            public void windowClosing(WindowEvent e) {

	                d.setVisible(false);//设置对话框不可见

	            }

	        });
	        d.setVisible(true);// 显示
	}

	/**
	 * 启动函数
	 * @param args
	 */
	public static void main(String[] args) {
		Pwdtool pwd=new Pwdtool();
		pwd.showFrame();

	}
	
	
	
	public void windowClosing(WindowEvent e){
        System.out.println("Closing");
        System.exit(0); //点击右上角关闭按钮
    }
    public void windowActivated(WindowEvent e1){
        System.out.println("Activated"); //每次窗口被激活
    }
    public void windowOpened(WindowEvent e2){
        System.out.println("Open"); //每次打开窗口,
    }
    
	/* (non-Javadoc)
	 * @see java.awt.event.WindowListener#windowClosed(java.awt.event.WindowEvent)
	 */
	@Override
	public void windowClosed(WindowEvent e) {
		System.out.println("Close"); //关闭后事件,不一定激活
		
	}
	/* (non-Javadoc)
	 * @see java.awt.event.WindowListener#windowIconified(java.awt.event.WindowEvent)
	 */
	@Override
	public void windowIconified(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}
	/* (non-Javadoc)
	 * @see java.awt.event.WindowListener#windowDeiconified(java.awt.event.WindowEvent)
	 */
	@Override
	public void windowDeiconified(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}
	/* (non-Javadoc)
	 * @see java.awt.event.WindowListener#windowDeactivated(java.awt.event.WindowEvent)
	 */
	@Override
	public void windowDeactivated(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

}

编译启动后的界面如下:

抛开其他框架的优越性不说。普通的UI工程还是能胜任的。导出的jar的体积也很小。

补充一

值得注意的是,AWT在Eclipse编译启动后,可能有乱码。中文字符显示一个方块。

此时可以设置run configuration中的启动配置,Common中的编码类型

或者在Argument中手动增加-Dfile.encoding=GBK. 后再启动。 这2个方法是一样的用途。

 

补充二

通过elclipse的Export导出独立的jar包时,如果依赖第3方jar,可以修改jar包中的配置文件

在项目里保存了一个MANIFEST.MF.txt文件。内容如下

Manifest-Version: 1.0
Class-Path: ./ xxxx.jar
Main-Class: pwdtool2.Pwdtool

导出时选择本地MANIFEST文件。

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AWTK开发手册-AWTK开发实践指南-中文手册.pdf AWTK = Toolkit AnyWhere 随着手机、智能手表等便携式设备的普及,用户对 GUI 的要求越来越高,嵌入式系统对高性能、高可靠性、低功耗、美观炫酷的 GUI 的需求也越来越迫切,ZLG开源 GUI 引擎 AWTK 应运而生。AWTK 全称为 Toolkit AnyWhere,是 ZLG 倾心打造的一套基于 C 语言开发的 GUI 框架。旨在为用户提供一个功能强大、高效可靠、简单易用、可轻松做出炫酷效果的 GUI 引擎,并支持跨平台同步开发,一次编程,终生使用。 最终目标: 支持开发嵌入式软件。 支持开发Linux应用程序。 支持开发MacOS应用程序。 支持开发Windows应用程序。 支持开发Android应用程序。 支持开发iOS应用程序。 支持开发2D游戏。 其主要特色有: 小巧。在精简配置下,不依赖第三方软件包,仅需要32K RAM + 256K FLASH即可开发一些简单的图形应用程序。 高效。采用脏矩形裁剪算法,每次只绘制和更新变化的部分,极大提高运行效率和能源利用率。 稳定。通过良好的架构设计和编程风格、单元测试、动态(valgrind)检查和Code Review保证其运行的稳定性。 丰富的GUI组件。提供窗口、对话框和各种常用的组件(用户可以配置自己需要的组件,降低对运行环境的要求)。 支持多种字体格式。内置位图字体(并提供转换工具),也可以使用stb_truetype或freetype加载ttf字体。 支持多种图片格式。内置位图图片(并提供转换工具),也可以使用stb_image加载png/jpg等格式的图片。 紧凑的二进制界面描述格式。可以手工编辑的XML格式的界面描述文件,也可以使用Qt Designer设计界面,然后转换成紧凑的二进制界面描述格式,提高运行效率,减小内存开销。 支持主题并采用紧凑的二进制格式。开发时使用XML格式描述主题,然后转换成紧凑的二进制格式,提高运行效率,减小内存开销。 支持裸系统,无需OS和文件系统。字体、图片、主题和界面描述数据都编译到代码中,以常量数据的形式存放,运行时无需加载到内存。 内置nanovg实现高质量的矢量动画,并支持SVG矢量图。 支持窗口动画、控件动画、滑动动画和高清LCD等现代GUI常见特性。 支持国际化(Unicode、字符串翻译和输入法等)。 可移植。支持移植到各种RTOS和嵌入式Linux系统,并通过SDL在各种流行的PC/手机系统上运行。 脚本化。从API注释中提取API的描述信息,通过这些信息可以自动生成各种脚本的绑定代码。 支持硬件2D加速(目前支持STM32的DMA2D和NXP的PXP)和GPU加速(OpenGL/OpenGLES/DirectX/Metal),充分挖掘硬件潜能。 丰富的文档和示例代码。 采用LGPL协议开源发布,在商业软件中使用时无需付费。 目前核心功能已经完成,内部开始在实际项目中使用了,欢迎有兴趣的朋友评估和尝试,期待您的反馈。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值