Java可視化計算器


利用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不需占有太多系統資源,因此稱為輕量級組件!!!)

區別:

  1. AWT 是基於本地方法的C/C++程序,其運行速度比較快;Swing是基於AWT的Java程序,其運行速度比較慢。
  2. AWT的控件在不同的平台可能表現不同,而Swing在所有平台表現一致。

如何選擇:

在實際應用中,應該使用AWT還是Swing取決於應用程序所部署的平台類型。例如:

  1. 對於一個嵌入式應用,目標平台的硬件資源往往非常有限,而應用程序的運行速度又是項目中至關重要的因素。在這種矛盾的情況下,簡單而高效的AWT當然成了嵌入式Java的第一選擇。
  2. 在普通的基於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  }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM