利用java中的AWT和SWING包來做可視化界面。
首先來簡單了解一下這兩個包:
AWT和Swing都是Java中用來做可視化界面的。AWT(Abstract Window Toolkit):抽象窗口工具包,早期編寫圖形界面應用程序的包。Swing :為解決 AWT 存在的問題而新開發的圖形界面包。Swing是對AWT的改良和擴展。
實現原理
AWT :是通過調用操作系統的native方法實現的,所以在Windows系統上的AWT窗口就是Windows的風格,而在Unix系統上的則是XWindow風格。 AWT 中的圖形函數與 操作系統 所提供的圖形函數之間有着一一對應的關系,我們把它稱為peers。 也就是說,當我們利用 AWT 來構件圖形用戶界面的時候,我們實際上是在利用 操作系統 所提供的圖形庫。由於不同 操作系統 的圖形庫所提供的功能是不一樣的,在一個平台上存在的功能在另外一個平台上則可能不存在。為了實現Java語言所宣稱的”一次編譯,到處運行”的概念,AWT 不得不通過犧牲功能來實現其平台無關性,也就是說,AWT 所提供的圖形功能是各種通用型操作系統所提供的圖形功能的交集。由於AWT 是依靠本地方法來實現其功能的,我們通常把AWT控件稱為重量級控件。
Swing :是所謂的Lightweight組件,不是通過native方法來實現的,所以Swing的窗口風格更多樣化。但是,Swing里面也有heaveyweight組件。比如JWindow,Dialog,JFrame。Swing由純Java寫成,可移植性好,外觀在不同平台上相同。所以Swing部件稱為輕量級組件( Swing是由純JAVA CODE所寫的,因此SWING解決了JAVA因窗口類而無法跨平台的問題,使窗口功能也具有跨平台與延展性的特性,而且SWING不需占有太多系統資源,因此稱為輕量級組件!!!)
區別:
- AWT 是基於本地方法的C/C++程序,其運行速度比較快;Swing是基於AWT的Java程序,其運行速度比較慢。
- AWT的控件在不同的平台可能表現不同,而Swing在所有平台表現一致。
如何選擇:
在實際應用中,應該使用AWT還是Swing取決於應用程序所部署的平台類型。例如:
- 對於一個嵌入式應用,目標平台的硬件資源往往非常有限,而應用程序的運行速度又是項目中至關重要的因素。在這種矛盾的情況下,簡單而高效的AWT當然成了嵌入式Java的第一選擇。
- 在普通的基於PC或者是工作站的標准Java應用中,硬件資源對應用程序所造成的限制往往不是項目中的關鍵因素。所以在標准版的Java中則提倡使用Swing,也就是通過犧牲速度來實現應用程序的功能。
在了解了這兩個包之后我們開始上主菜,我們今天的寫的簡易計算器的實現:
1 import java.awt.*; 2 import java.awt.event.ActionEvent; 3 import java.awt.event.ActionListener; 4 import java.util.Stack; 5 import javax.swing.JApplet; 6 import javax.swing.JButton; 7 import javax.swing.JFrame; 8 import javax.swing.JPanel; 9 import javax.swing.JTextField; 10 class Main extends JApplet implements ActionListener { 11 private JTextField textField = new JTextField("請輸入", 12); 12 String operator = ""; //操作 13 String input = ""; //輸入的 式子 14 boolean flag = true; 15 16 public void init() //重寫Applet里邊的init方法 17 { 18 textField.setFont(new Font("宋體", Font.PLAIN, 50));//設置字體格式 19 textField.setEditable(false); //設置文本框不可更改 20 Container C = getContentPane(); 21 JButton b[] = new JButton[17]; 22 JPanel panel = new JPanel(); 23 JPanel panel1 = new JPanel(); 24 panel1.add(textField); 25 panel.setLayout(new GridLayout(4, 4, 5, 5)); 26 panel1.setLayout(new FlowLayout(3)); 27 C.add(panel, BorderLayout.CENTER); 28 C.add(panel1, BorderLayout.NORTH); 29 String name[] = {"7", "8", "9", "+", "4", "5", "6", "-", "1", "2", "3", "*", ".", "0", "=", "/", "C"};//設置按鈕 30 for (int i = 0; i < 17; i++)//添加按鈕 31 { 32 b[i] = new JButton(name[i]); 33 b[i].setBackground(new Color(192, 192, 192)); 34 b[i].setForeground(Color.BLACK); //設置按鍵顏色 35 if (i % 4 == 3) 36 b[i].setForeground(Color.RED);//設置按鍵顏色 37 b[i].setFont(new Font("宋體", Font.PLAIN, 16));//設置字體格式 38 panel.add(b[i]);//將按鍵添加到界面 39 b[i].addActionListener(this); 40 } 41 panel1.add(b[16]); 42 b[16].setPreferredSize(new Dimension(65, 65)); 43 44 45 b[13].setForeground(Color.RED); 46 } 47 48 public void actionPerformed(ActionEvent e) { 49 int cnt = 0; 50 String actionCommand = e.getActionCommand(); 51 if (actionCommand.equals("+") || actionCommand.equals("-") || actionCommand.equals("*") || actionCommand.equals("/")) 52 input += " " + actionCommand + " ";//設置輸入,把輸入的樣式改成 需要的樣子 53 else if (actionCommand.equals("C")) 54 input = ""; 55 else if (actionCommand.equals("="))//當監聽到等號時,則處理 input 56 { 57 input += "=" + compute(input); 58 textField.setText(input); 59 input = ""; 60 cnt = 1; 61 } else 62 input += actionCommand;//數字為了避免多位數的輸入 不需要加空格 63 if (cnt == 0) 64 textField.setText(input); 65 } 66 67 /*使用棧對數據進行計算*/ 68 private String compute(String input)// 69 { 70 String str[]; 71 str = input.split(" "); 72 Stack<Double> s = new Stack<Double>(); 73 double m = Double.parseDouble(str[0]); 74 s.push(m); 75 for (int i = 1; i < str.length; i++) { 76 if (i % 2 == 1) { 77 if (str[i].compareTo("+") == 0) { 78 double help = Double.parseDouble(str[i + 1]); 79 s.push(help); 80 } 81 if (str[i].compareTo("-") == 0) { 82 double help = Double.parseDouble(str[i + 1]); 83 s.push(-help); 84 } 85 if (str[i].compareTo("*") == 0) { 86 double help = Double.parseDouble(str[i + 1]); 87 double ans = s.peek();//取出棧頂元素 88 s.pop();//消棧 89 ans *= help; 90 s.push(ans); 91 } 92 if (str[i].compareTo("/") == 0) { 93 double help = Double.parseDouble(str[i + 1]); 94 double ans = s.peek(); 95 s.pop(); 96 ans /= help; 97 s.push(ans); 98 } 99 } 100 } 101 double ans = 0d; 102 while (!s.isEmpty()) { 103 ans += s.peek(); 104 s.pop(); 105 } 106 String result = String.valueOf(ans); 107 return result; 108 } 109 110 public static void main(String args[]) { 111 JFrame frame = new JFrame("Counter");//創建頂級窗口 112 frame.setResizable(false); 113 Main applet = new Main(); 114 frame.getContentPane().add(applet, BorderLayout.CENTER); 115 applet.init(); //applet的init方法 116 applet.start(); //線程開始 117 frame.setSize(400, 450); //設置窗口大小 118 frame.setVisible(true); //設置窗口可見 119 } 120 }