java SWT/Rap 计算器版本2(键盘鼠标兼容)
package cn.lesaas.nof.rwtswt.ui.dialog;
import java.math.BigDecimal;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import cn.lesaas.nof.conn.base.MyAsyncCallback;
import cn.lesaas.nof.rsclient.UC;
/*
*计算器类,没有继承模态窗口
*/
public class CalcDialog extends Dialog {
private int dialogId = -1;
/**
*
*/
private static final long serialVersionUID = 1L;
private static final int ID = -1;
/** 计算器上的键的显示名字 */
private final static String[] keys = { "Backspace", "C", "+", "-", "*", "%除号", "7", "8", "9", "4", "5", "6", "1",
"2", "3", "0", ".", "=默认焦点" };
/** 计算器上的功能键的显示名字 */
/** 计算结果文本框 */
// private static Text resultText;
private static Text labtopNum;// 上面存放的是数字和符号
private static Text labdownresult;// 每次输入的的数字及两个数的和
// 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字
private static boolean firstDigit = true;
// 计算的中间结果。
private static double resultNum = 0.0;
// 当前运算的运算符
private static String operator = "=";
// 操作是否合法
private static boolean operateValidFlag = true;
private static Button buttonKey = null;
boolean closed;
Shell shell;
private MyAsyncCallback cbOpen;
public CalcDialog(Shell parent) {
super(parent, SWT.TITLE);
}
// 创建窗口大小
protected void createShell() {
shell = new Shell(getParent(), getStyle());
shell.setLayout(new FormLayout());
onCreateShell();
}
protected void onCreateShell() {
shell.setText("计算器");
shell.setSize(336, 380);
//shell.setSize(width, height);
Composite composite = new Composite(shell, SWT.NONE);
try {
onCreateMainPanel(composite);
onCreateButtons(composite);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected void onCreateMainPanel(Composite parent) throws Exception {
Calc(parent);
}
/**
* 初始化计算器
*/
public static void Calc(Composite parent) {
parent.setLayout(new GridLayout());
labtopNum = new Text(parent, SWT.RIGHT | SWT.READ_ONLY | SWT.BORDER);//
GridData gridDataLab = new GridData(GridData.FILL_HORIZONTAL);// GridData是指定子控件的信息
gridDataLab.heightHint = 25;// 初始高度为20
gridDataLab.horizontalSpan = 3;// 跨三列
labtopNum.setLayoutData(gridDataLab);
labtopNum.setText("");// 只用来存放每次输入的数字和符号
labtopNum.setFont(UC.getLoginFont());
// 创建数字显示框
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);// GridData是指定子控件的信息
// resultText = new Text(parent, SWT.RIGHT | SWT.BORDER|SWT.READ_ONLY);
labdownresult = new Text(parent, SWT.RIGHT | SWT.READ_ONLY | SWT.BORDER);// |
// SWT.BORDER
gridData.heightHint = 25;// 初始高度为20
gridData.horizontalSpan = 3;// 跨三列
labdownresult.setLayoutData(gridData);
labdownresult.setText("");// 存放这个是对数的结果
labdownresult.setFont(UC.getLoginFont());
// labdownresult.setFocus();
Composite composite = new Composite(parent, SWT.NONE);
GridLayout gridLayoutKey = new GridLayout(3, true);
gridLayoutKey.marginWidth = 0;// 设置按钮距离父控件的左边距为0
gridLayoutKey.marginHeight = 0;// 设置按钮距离父控件的右边距为0
composite.setLayout(gridLayoutKey);
GridData gridDataKey = new GridData(GridData.FILL_HORIZONTAL);
// gridDataKey.horizontalSpan = 3;
composite.setLayoutData(gridDataKey);
// 初始化功能键,都用红色标示。将功能键放在一个画板内
// 用网格布局器,1行,3列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素
int length = keys.length;
int i = 0;
for (i = 0; i < length; i++) {
buttonKey = new Button(composite, SWT.PUSH);
gridDataKey = new GridData(GridData.FILL_BOTH);
buttonKey.setLayoutData(gridDataKey);
buttonKey.setText(keys[i]);
buttonKey.forceFocus();
Listener listener = new Listener() {
public void handleEvent(Event e) {
if (e.type == SWT.Selection) {
Button button = (Button) e.widget;
String btnText = button.getText();
// 获取事件源的标签
if (btnText.equals("Backspace")) {
// 用户按了"Backspace"键
handleBackspace();
} else if (btnText.equals("C")) {
// 用户按了"C"键
handleC();
} else if ("0123456789.".indexOf(btnText) >= 0) {
// 用户按了数字键或者小数点键
// topRecord(btnText);
handleNumber(btnText);
// handlezero(zero);
} else if(btnText.equals("+")||btnText.equals("-")||btnText.equals("*")||btnText.equals("%除号")||btnText.equals("=默认焦点")) {
// 用户按了运算符键
if (btnText.equals("%除号"))btnText = "%";
if (btnText.equals("=默认焦点"))btnText = "=";
boolean flag = topRecord(btnText);
if (flag) {
handleOperator(btnText);
}
}
}
}
};
buttonKey.addListener(SWT.Selection, listener);
}
Listener listener = new Listener() {
public void handleEvent(Event e) {
if (e.type == SWT.KeyDown) {
// 0-9.----131072+
char c = e.character;
String str = String.valueOf(c);
if (c >= '0' && c <= '9' || c == '.') {
//String markStr = String.valueOf(c);
boolean flag = topRecord(str);
if (flag) {
handleNumber(str);
}
} else if ((c == '+' && e.keyCode == 107) || (c == '+' && e.keyCode == 61) || (c == '-'&& e.keyCode == 109)||(c == '-'&& e.keyCode == 173) || c == '*' || c == '%') {// 61是+也是=,53此按钮%,173此按钮-,191你单击KeyDown了此按钮/
c = e.character;// "\r"
String markStr = String.valueOf(c);
boolean flag = topRecord(markStr);
if (flag) {
handleOperator(markStr);
}
} else if (e.keyCode == 108 || e.keyCode == 13 || (e.keyCode == 61&&c=='=')) {// 专门针对Enter就是=-=-e.keyCode==187+=
String markStr = "=";
boolean flag = topRecord(markStr);
if (flag) {
handleOperator(markStr);
}
buttonKey.forceFocus();
} else if (e.keyCode == 8) {// 用户按了"Backspace"键
handleBackspace();
} else if (e.keyCode == 127 || e.keyCode == 'C') {// Delete||C
// 用户按了"C"键
handleC();
}
}
}
};
// 注册无类型的事件监听器
//buttonKey.addListener(SWT.Verify, listener);
buttonKey.addListener(SWT.KeyDown, listener);
//buttonKey.addListener(SWT.Selection, listener);
}
/**
* 处理Backspace键被按下的事件
*/
private static void handleBackspace() {
String text = labdownresult.getText();
int i = text.length();
if (i > 0) {
// 退格,将文本最后一个字符去掉
text = text.substring(0, i - 1);
if (text.length() == 0) {
// 如果文本没有了内容,则初始化计算器的各种值
labdownresult.setText("0");
firstDigit = true;
operator = "=";
} else {
// 显示新的文本
labdownresult.setText(text);
}
}
}
private static boolean topRecord(String key) {
char c = key.charAt(0);
if (c >= '0' && c <= '9'&&c!='.') {
} else if ((c == '+' || c == '-' || c == '*' || c == '%' || c == '=')) {
String downStr = labdownresult.getText();
String top = labtopNum.getText();
if (downStr.isEmpty() && top.isEmpty() && !key.equals("=")) {
labtopNum.setText(0 + key);
} else if (!downStr.isEmpty() && !top.isEmpty() && !key.equals("=")) {
String topMark = top.substring(top.length() - 1, top.length());
double downParst = Double.parseDouble(downStr);
if (!operator.equals("=") && !key.equals("=") && downParst == resultNum
&& (topMark.equals("+") || topMark.equals("-") || topMark.equals("*") || topMark.equals("%"))) {// 12+1+-
String topFirst = top.substring(0, top.length() - 1);
labtopNum.setText(topFirst + key);
// labdownresult.setText(downStr);
operator = key;/// 替换了符号,但符号不能去计算
return false;
} else {
String str = labdownresult.getText();
// String str=String.valueOf(resultNum);
if (str.contains(".")) {
String first = str.substring(0, str.indexOf("."));
String last = str.substring(str.indexOf(".") + 1, str.length());
if (last.equals("0")) {
labtopNum.setText(top + first + key);
} else {
labtopNum.setText(top + str + key);
}
} else {
labtopNum.setText(top + str + key);
}
}
// labtopNum.setText(top+str+key);
} else if (!downStr.isEmpty() && !top.isEmpty() && operator.equals("=") && !key.equals("=")) {
// String str=labdownresult.getText();
String str = String.valueOf(resultNum);
if (str.contains(".")) {
String first = str.substring(0, str.indexOf("."));
String last = str.substring(str.indexOf(".") + 1, str.length());
if (last.equals("0")) {
labtopNum.setText(top + first + key);
} else {
labtopNum.setText(top + str + key);
}
} else {
labtopNum.setText(str + key);
}
// labtopNum.setText(top+str+key);
}
else if (!downStr.isEmpty() && top.isEmpty() && !key.equals("=")) {
String str = labdownresult.getText();
if (str.contains(".")) {
String first = str.substring(0, str.indexOf("."));
String last = str.substring(str.indexOf(".") + 1, str.length());
if (last.equals("0")) {
labtopNum.setText(first + key);
} else {
labtopNum.setText(str + key);
}
} else {
labtopNum.setText(str + key);
}
} else if (key.equals("=")) {
labtopNum.setText("");
}
}
return true;
}
private static void handleNumber(String key) {
if (firstDigit&&key.equals(".")) {
// 输入的第一个数字
labdownresult.setText(0+key);
}else if(firstDigit){
labdownresult.setText(key);
}else if ((key.equals(".")) && (labdownresult.getText().indexOf(".") < 0)
&& !labdownresult.getText().contains(".")) {
// 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面
labdownresult.setText(labdownresult.getText() + ".");
} else if (!key.equals(".")) {
// 如果输入的不是小数点,则将数字附在结果文本框的后面
labdownresult.setText(labdownresult.getText() + key);
}
// 以后输入的肯定不是第一个数字了
firstDigit = false;
}
/**
* 处理C键被按下的事件
*/
private static void handleC() {
String txtNum = labtopNum.getText();
if (!txtNum.isEmpty()) {
labtopNum.setText("");
}
// 初始化计算器的各种值
resultNum = 0.0;// 为了清除上次保留的静态值
labdownresult.setText("0");
firstDigit = true;
operator = "=";
}
/**
* 处理运算符键被按下的事件
*
* @param key
*/
private static void handleOperator(String key) {
// operator = key;
if (operator.equals("%")) {
// 除法运算
// 如果当前结果文本框中的值等于0
if (getNumberFromText() == 0.0) {
// 操作不合法
operateValidFlag = false;
labdownresult.setText("除数不能为零");
} else {
if (key.equals("%"))
key = "/";
// resultNum /= getNumberFromText();
resultNum = div(resultNum, getNumberFromText());
}
} else if (operator.equals("+")) {
// 加法运算
// resultNum += getNumberFromText();
resultNum = add(resultNum, getNumberFromText());
} else if (operator.equals("-")) {
// 减法运算
// resultNum -= getNumberFromText();
resultNum = sub(resultNum, getNumberFromText());
} else if (operator.equals("*")) {
// 乘法运算
// resultNum *= getNumberFromText();
resultNum = mul(resultNum, getNumberFromText());
} else if (operator.equals("=")) {
// 赋值运算11+23+55;--resultNum=8--+3===-1+2+5+3
resultNum = getNumberFromText();
// labtopNum.setText("");
}
if (operateValidFlag) {
// 双精度浮点数的运算
long t1;
double t2;
t1 = (long) resultNum;
t2 = resultNum - t1;
if (t2 == 0) {
labdownresult.setText(String.valueOf(t1));
} else {
labdownresult.setText(String.valueOf(resultNum));
}
}
// 运算符等于用户按的按钮
operator = key;
firstDigit = true;
operateValidFlag = true;
}
/**
* 从结果文本框中获取数字
*
* @return
*/
private static double getNumberFromText() {
double result = 0;
String down = labdownresult.getText();
try {
result = Double.valueOf(down).doubleValue();
} catch (NumberFormatException e) {
}
return result;
}
private static final int DEF_DIV_SCALE = 10;
/**
* * 两个Double数相加 *
*
* @param v1
* *
* @param v2
* *
* @return Double
*/
public static Double add(Double v1, Double v2) {
BigDecimal b1 = new BigDecimal(v1.toString());
BigDecimal b2 = new BigDecimal(v2.toString());
return new Double(b1.add(b2).doubleValue());
}
/**
* * 两个Double数相减 *
*
* @param v1
* *
* @param v2
* *
* @return Double
*/
public static Double sub(Double v1, Double v2) {
BigDecimal b1 = new BigDecimal(v1.toString());
BigDecimal b2 = new BigDecimal(v2.toString());
return new Double(b1.subtract(b2).doubleValue());
}
/**
* * 两个Double数相乘 *
*
* @param v1
* *
* @param v2
* *
* @return Double
*/
public static Double mul(Double v1, Double v2) {
BigDecimal b1 = new BigDecimal(v1.toString());
BigDecimal b2 = new BigDecimal(v2.toString());
return new Double(b1.multiply(b2).doubleValue());
}
/**
* * 两个Double数相除 * java 中的加减乘除
*
* @param v1
* *
* @param v2
* *
* @return Double
*/
public static Double div(Double v1, Double v2) {
BigDecimal b1 = new BigDecimal(v1.toString());
BigDecimal b2 = new BigDecimal(v2.toString());
return new Double(b1.divide(b2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue());
}
// /**
// * * 两个Double数相除,并保留scale位小数 *
// *
// * @param v1 *
// * @param v2 *
// * @param scale *
// * @return Double
// */
// public static Double div(Double v1, Double v2, int scale) {
// if (scale < 0) {
// throw new IllegalArgumentException(
// "The scale must be a positive integer or zero");
// }
// BigDecimal b1 = new BigDecimal(v1.toString());
// BigDecimal b2 = new BigDecimal(v2.toString());
// return new Double(b1.divide(b2, scale,
// BigDecimal.ROUND_HALF_UP).doubleValue());
// }
public void open(boolean isCenter, MyAsyncCallback cbOpen) {
this.cbOpen = cbOpen;
closed = false;
try {
createShell();
if (!closed)
shell.open();
if (isCenter) {
UC.centerShell(shell);
// onCreateShell(shell);
}
} catch (Exception e) {
e.printStackTrace();
// cbOpen.onFailure(dialogId,e);
}
}
protected void onCreateButtons(Composite composite) {
Button button = new Button(composite, SWT.BORDER);
GridData gridData1 = new GridData(SWT.FILL, SWT.FILL, true, false);
button.setLayoutData(gridData1);
button.setBackground(UC.getColor());
button.setText("关闭");
button.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent arg0) {
resultNum = 0.0;
close();
}
@Override
public void widgetDefaultSelected(SelectionEvent arg0) {
// TODO Auto-generated method stub
}
});
}
public final void close() {
closed = true;
shell.close();
}
}
java SWT/Rap 计算器版本2(键盘鼠标兼容)的更多相关文章
- java 计算器SWT/RAP(版本3)键盘鼠标兼容
java 计算器SWT/RAP(版本3)键盘鼠标兼容,之前版本也对,但存在线程失效问题,当多人访问时,就容易线程失效,一直犯得一个错误就是一直用static变量和static方法, 之前加了什么js界 ...
- Java SWT 做计算器。
java -- swt - - 计算器 环境搭建 安装java.eclipse.以及对应的swt插件. 开始工程 建立工程: 在java下建立一个在其他 —- WindowsBuilder — ...
- SWT/RAP计算器
/** *2.测试 */ public class NofTest extends AbstractEntryPoint { Text text,text2; RemoteObje ...
- C# 计算器 如果设置键盘输入的监听事件
这个事情困扰了我好久,之前java写的计算器程序可以正常运行了,但是因为打包问题(尝试过多次,感觉好麻烦,个人比较崇尚“点子”,注重创新,思来想去之后,决定试试C#模仿java再写一遍),想要用C#模 ...
- Ubuntu 14.10 下安装Synergy,不同电脑之间公用一套键盘鼠标
因为工作时候有多台电脑放在一起,如果每个用一套键盘鼠标很是不方便,所以希望能够不用电脑之间公用一套键盘鼠标. Synergy可以实现不同电脑之间公用一套键盘鼠标,并且支持简单的复制粘贴.很好用. 它还 ...
- DD XOFT虚拟键盘鼠标
下载:http://www.ddxoft.com/ 简介:最多用户选择,最简单易用,最稳定可靠 永久免费 系统底层集成,真正的驱动级硬件模拟 一键安装,即为电脑添加一对可完全编程控制的键盘鼠标,轻松自 ...
- mac与windows共享键盘鼠标(synergy)
桌面上有两台电脑, 一台mac一台windows, 由于桌面空间紧张, 放两套键盘鼠标有点浪费空间, 如果能让mac和windows共享键盘鼠标就好了, 经过一番搜寻, 找到了一款名为synergy的 ...
- 如何在官网下载java JDK的历史版本
如何在官网下载java JDK的历史版本 http://jingyan.baidu.com/article/9989c746064d46f648ecfe9a.html 如何在官网下载java JDK的 ...
- 键盘鼠标共享效率工具----Synergy
在日常工作中,为了提高工作效率以及用户体验,会一个主机接多个显示器,像程序员一般都是使用两块显示器. 然而,有很多人是和我一样,自己有多台电脑,两个笔记本.公司一个台式机,如何在台机器之间来回切换工作 ...
随机推荐
- css3倒影
使用CSS3制作倒影 img { -webkit-box-reflect: below 0px -webkit-gradient(linear, left top, left bottom, from ...
- Centos 下安装MongoDB
Centos 下安装MongoDB 一.安装方法 方法(一) 1 配置包管理系统 创建/etc/yum.repos.d/mongodb.repo 文件,当然我们使用的是64位系统,32位的情况不再考 ...
- 最大流加强 dinic+当前弧优化
qyy开始练习网络流啦 , 啊 ,蒟蒻只会套版 ,很裸的题 , 我连题都不想发了 ,可以参考我的代码(虽然我也是看的别人的 #include <iostream> #include < ...
- 3proxy 二级代理配置样例
适应情况: 有时,我们的机器HOST-A只能通过代理服务器HOST-B才可以访问internet, 而与我们相连的机器HOST-C也需要访问internet, 但是HOST-C却不能直接访问HOST- ...
- Linux下部署LVS(DR)+keepalived+Nginx负载均衡
架构部署 LVS/keepalived(master):192.168.21.3 LVS/keepalived(Slave):192.168.21.6 Nginx1:192.168.21.4 N ...
- 匿名类型和Object转换
本文转载:http://www.cnblogs.com/JustRun1983/archive/2012/05/13/2497997.html net中的匿名类型非常好用, 但是开发中遇到一个问题,当 ...
- [转]Android UI:看看Google官方自定义带旋转动画的ImageView-----RotateImageView怎么写(附 图片淡入淡出效果)
http://blog.csdn.net/yanzi1225627/article/details/22439119 众所周知,想要让ImageView旋转的话,可以用setRotation()让其围 ...
- 【UVA】11732 - strcmp() Anyone?
一開始不知道这样的一维建树方法. 每次一层用一个链指向下一层最左边的结点,之后每一层用一个链表串联全部的结点,这样就建树成功了. 14328524 11732 option=com_onlinejud ...
- android tips—启动Emergency call拨号盘
Intent intent = new Intent(); intent.setAction("com.android.phone.EmergencyDialer.DIAL"); ...
- FastJson解析对象及对象数组--项目经验
第一次使用json,解析工具为FastJson,使用语言为java 常见的json解析实例,以map为例: Map<String,String> map=new HashMap<St ...