zoukankan      html  css  js  c++  java
  • 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  }
  • 相关阅读:
    抖音服务器带宽有多大,才能供上亿人同时刷?今天长见识了。。
    用了很多年的 CMS 垃圾收集器,终于换成了 G1,真香!!
    Spring Boot 项目脚本(启动、停止、重启、状态)
    正排倒排,并不是 MySQL 的排序的全部!
    自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10 倍!
    beego实现多端口监听
    区块链分类
    Hyperledger/Fabric
    register db `default`, default addr for network 'localhost:3306' unknown must have one register DataBase alias named `default`
    go vendor的正确打开方式
  • 原文地址:https://www.cnblogs.com/hetaoyuan/p/11105538.html
Copyright © 2011-2022 走看看