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 ...