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