1. 程式人生 > >JAVA-UI程式設計之-AWT介面程式設計

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檔案。