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不需占有太多系统资源,因此称为轻量级组件!!!)
区别:
- AWT 是基于本地方法的C/C++程序,其运行速度比较快;Swing是基于AWT的Java程序,其运行速度比较慢。
- AWT的控件在不同的平台可能表现不同,而Swing在所有平台表现一致。
如何选择:
在实际应用中,应该使用AWT还是Swing取决于应用程序所部署的平台类型。例如:
- 对于一个嵌入式应用,目标平台的硬件资源往往非常有限,而应用程序的运行速度又是项目中至关重要的因素。在这种矛盾的情况下,简单而高效的AWT当然成了嵌入式Java的第一选择。
- 在普通的基于PC或者是工作站的标准Java应用中,硬件资源对应用程序所造成的限制往往不是项目中的关键因素。所以在标准版的Java中则提倡使用Swing,也就是通过牺牲速度来实现应用程序的功能。
在了解了这两个包之后我们开始上主菜,我们今天的写的简易计算器的实现:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Stack;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
class Main extends JApplet implements ActionListener {
private JTextField textField = new JTextField("请输入", 12);
String operator = ""; //操作
String input = ""; //输入的 式子
boolean flag = true; public void init() //重写Applet里边的init方法
{
textField.setFont(new Font("宋体", Font.PLAIN, 50));//设置字体格式
textField.setEditable(false); //设置文本框不可更改
Container C = getContentPane();
JButton b[] = new JButton[17];
JPanel panel = new JPanel();
JPanel panel1 = new JPanel();
panel1.add(textField);
panel.setLayout(new GridLayout(4, 4, 5, 5));
panel1.setLayout(new FlowLayout(3));
C.add(panel, BorderLayout.CENTER);
C.add(panel1, BorderLayout.NORTH);
String name[] = {"7", "8", "9", "+", "4", "5", "6", "-", "1", "2", "3", "*", ".", "0", "=", "/", "C"};//设置按钮
for (int i = 0; i < 17; i++)//添加按钮
{
b[i] = new JButton(name[i]);
b[i].setBackground(new Color(192, 192, 192));
b[i].setForeground(Color.BLACK); //设置按键颜色
if (i % 4 == 3)
b[i].setForeground(Color.RED);//设置按键颜色
b[i].setFont(new Font("宋体", Font.PLAIN, 16));//设置字体格式
panel.add(b[i]);//将按键添加到界面
b[i].addActionListener(this);
}
panel1.add(b[16]);
b[16].setPreferredSize(new Dimension(65, 65)); b[13].setForeground(Color.RED);
} public void actionPerformed(ActionEvent e) {
int cnt = 0;
String actionCommand = e.getActionCommand();
if (actionCommand.equals("+") || actionCommand.equals("-") || actionCommand.equals("*") || actionCommand.equals("/"))
input += " " + actionCommand + " ";//设置输入,把输入的样式改成 需要的样子
else if (actionCommand.equals("C"))
input = "";
else if (actionCommand.equals("="))//当监听到等号时,则处理 input
{
input += "=" + compute(input);
textField.setText(input);
input = "";
cnt = 1;
} else
input += actionCommand;//数字为了避免多位数的输入 不需要加空格
if (cnt == 0)
textField.setText(input);
} /*使用栈对数据进行计算*/
private String compute(String input)//
{
String str[];
str = input.split(" ");
Stack<Double> s = new Stack<Double>();
double m = Double.parseDouble(str[0]);
s.push(m);
for (int i = 1; i < str.length; i++) {
if (i % 2 == 1) {
if (str[i].compareTo("+") == 0) {
double help = Double.parseDouble(str[i + 1]);
s.push(help);
}
if (str[i].compareTo("-") == 0) {
double help = Double.parseDouble(str[i + 1]);
s.push(-help);
}
if (str[i].compareTo("*") == 0) {
double help = Double.parseDouble(str[i + 1]);
double ans = s.peek();//取出栈顶元素
s.pop();//消栈
ans *= help;
s.push(ans);
}
if (str[i].compareTo("/") == 0) {
double help = Double.parseDouble(str[i + 1]);
double ans = s.peek();
s.pop();
ans /= help;
s.push(ans);
}
}
}
double ans = 0d;
while (!s.isEmpty()) {
ans += s.peek();
s.pop();
}
String result = String.valueOf(ans);
return result;
} public static void main(String args[]) {
JFrame frame = new JFrame("Counter");//创建顶级窗口
frame.setResizable(false);
Main applet = new Main();
frame.getContentPane().add(applet, BorderLayout.CENTER);
applet.init(); //applet的init方法
applet.start(); //线程开始
frame.setSize(400, 450); //设置窗口大小
frame.setVisible(true); //设置窗口可见
}
}
最新文章
- 一枚招聘信息——微信支付web前端开发工程师【已招到】
- 再次推荐一款逼真的HTML5下雪效果
- remi
- (转) Artificial intelligence, revealed
- html/京东项目/京东网页高仿/js/jq/css/java web/
- 安装sql2008的时候选择的是Windows身份验证,现在我想用sql server身份验证,我应该到哪儿设置呢
- include使用中注意的问题
- webform 中使用ajax
- Swift高级语法学习总结
- Git基本交互流程图
- bjui简单了解
- centos ssh 无密码登录
- 使用行为树(Behavior Tree)实现网游奖励掉落系统
- android学习日记03--常用控件ListView
- 泰泽新闻:英特尔三星双否认泰泽Tizen系统已死
- [转]深入理解JavaScript系列
- C++ Primer 5th 第6章 函数
- java通过JDBC链接SQLServer2012 (含1433端口打通)
- 浅谈java中的祖先类Object
- 基于ModBus-TCP/IT 台达PLC 通讯协议解析
热门文章
- k8s dashboard 解决secret自建证书导致浏览器访问限制
- 十九、Python之socket编程
- pod install/update失败:Failed to connect to 127.0.0.1 port 1080: Connection refused
- ubuntu 1804安装详解
- 网传英特尔酷睿第十代桌面处理器(Comet Lake 14nm)规格
- 10-cmake语法-CMakeParseArguments
- VS Code配置Python
- go安装及使用
- ansible-playbook实例
- ESA2GJK1DH1K基础篇: 移植官方MQTT包,让TCP实现MQTT功能(以GPRS模块为例)