入门SWT-简单的计算器界面和功能

入门SWT-简单的计算器界面和功能

一开始需要在java项目中导入SWT的jar包,可以百度一下SWT的jar包找下资源下载就行,一般Eclipse也有自带的。

先放张效果图
入门SWT-简单的计算器界面和功能

一开始我们需要写出一个基础界面。

	public static void main(String[] args) {
			Display display = new Display();
			Shell shell = new Shell();
			shell.open();
			while(!shell.isDisposed()) {
				if(!display.readAndDispatch())
					display.sleep();
			}
			display.dispose();
	}

这样我们的基础界面就出来了,之后在上面把我们的计算器界面写上去。

	public static void main(String[] args) {
			Display display = new Display();
			Shell shell = new Shell(display, SWT.MIN);//让界面固定,不能放大
			shell.setText("计算器");//给我们的界面设置标题
			shell.setBounds(300, 100, 310, 345);//给我们的界面定义一个大小
			GridLayout gridlayout = new GridLayout();//我们这里定义一个网格布局
			gridlayout.numColumns = 15;//设置列数为15
			shell.setLayout(gridlayout);//让我们的界面应用这个网格布局

			Color white = new Color(null, 255, 255, 255);//定义一个白色作为文本框的底色
			GridData griddata = new GridData();//其中文本框的样式
			griddata.widthHint = 200;//宽200
			griddata.heightHint = 20;//高20
			griddata.horizontalSpan = 11;//在15列中占11列
			Text text = new Text(shell, SWT.READ_ONLY | SWT.RIGHT);//定义一个文本框,设置为只读和文本居右,为了使数据可以复制,我使用的是文本框,也可以使用Label等样式
			text.setText("0");//设置文本框中的初始数据
			text.setBackground(white);//设置文本颜色
			text.setLayoutData(griddata);//让文本框应有样式
			
			GridData griddata4 = new GridData();
			griddata4.widthHint = 20;
			griddata4.heightHint = 20;
			griddata4.horizontalSpan = 1;
			Text text2 = new Text(shell, SWT.READ_ONLY);
			text2.setText("");
			text2.setBackground(white);
			text2.setLayoutData(griddata4);
			
			GridData griddata3 = new GridData();
			griddata3.widthHint = 50;
			griddata3.heightHint = 20;
			griddata3.horizontalSpan = 3;
			Text text1 = new Text(shell, SWT.READ_ONLY);
			text1.setText("0");
			text1.setBackground(white);
			text1.setLayoutData(griddata3);

			shell.open();
			while(!shell.isDisposed()) {
				if(!display.readAndDispatch())
					display.sleep();
			}
			display.dispose();
	}

此时运行的效果图为
入门SWT-简单的计算器界面和功能

我们来继续将界面完成,以下代码在上面继续写出即可

		String[] b = { "backspace", "CE", "C" };//定义一个数组
		GridData griddate1 = new GridData();
		griddate1.widthHint = 95;
		griddate1.heightHint = 40;
		griddate1.horizontalSpan = 5;
		for (int i = 0; i < b.length; i++) {//通过数组我们通过for循环将数组上的元素在按钮上显示出来
			Button button = new Button(shell, SWT.PUSH);//定义一个按钮
			button.setText(b[i]);//将数组中的元素放到按钮的文本上
			button.setLayoutData(griddate1);
			}

		String[] a = { "7", "8", "9", "+", "√", "4", "5", "6", "-", "%", "1", "2", "3", "*" };
		GridData griddate = new GridData();
		griddate.widthHint = 55;
		griddate.heightHint = 55;
		griddate.horizontalSpan = 3;
		griddate.verticalSpan = 3;

		for (int i = 0; i < a.length; i++) {
			Button button = new Button(shell, SWT.PUSH);
			button.setText(a[i]);
			button.setLayoutData(griddate);
			}
			
		GridData griddata1 = new GridData();
		griddata1.widthHint = 55;
		griddata1.heightHint = 115;
		griddata1.verticalSpan = 6;
		griddata1.horizontalSpan = 3;
		Button button = new Button(shell, SWT.PUSH);
		button.setText("=");
		button.setLayoutData(griddata1);
			
		GridData griddata2 = new GridData();
		griddata2.widthHint = 115;
		griddata2.heightHint = 55;
		griddata2.horizontalSpan = 6;
		griddata2.verticalSpan = 3;
		Button button1 = new Button(shell, SWT.PUSH);
		button1.setText("0");
		button1.setLayoutData(griddata2);

		String[] c = { ".", "/" };
		for (int i = 0; i < c.length; i++) {
			Button button2 = new Button(shell, SWT.PUSH);
			button2.setText(c[i]);
			button2.setLayoutData(griddate);
			}
			

此时我们的计算器界面就出来了,运行过后效果图如下
入门SWT-简单的计算器界面和功能

此时我们计算器的整体界面完成后需要开始对各个按钮功能进行实现。

我们在最初定义三个元素

	public static double s1 = 0;//代表计算的第一个数据
	public static double s2 = 0;//代表计算的第二个数据
	public static double re = 0;//代表结果

“backspace”, “CE”, “C” 的按钮我们将其设置为回归初始。
我们在这几个按钮的循环中加入以下按钮监听事件

button.addSelectionListener(new SelectionListener() {

				@Override
				public void widgetSelected(SelectionEvent arg0) {
					// TODO Auto-generated method stub
					text.setText("0");//使第一个框为0
					text1.setText("0");//使结果框为0
					text2.setText("");//使按钮框为0
					s1 = 0;//数据为0
					s2 = 0;
				}

				@Override
				public void widgetDefaultSelected(SelectionEvent arg0) {
					// TODO Auto-generated method stub

				}
			});

数字输入按钮中我们加入以下按钮监听效果

button.addSelectionListener(new SelectionListener() {

				@Override
				public void widgetSelected(SelectionEvent arg0) {
					// TODO Auto-generated method stub
					if (button.getText() == "1" || button.getText() == "2" || button.getText() == "3"
							|| button.getText() == "4" || button.getText() == "5" || button.getText() == "6"
							|| button.getText() == "7" || button.getText() == "8" || button.getText() == "9") {
						if (text.getText().equals("0")) {
							text.setText(button.getText());
						} else {
							text.setText(text.getText() + button.getText());
						}
					}//到此实现数字输入功能
					if (button.getText() == "+") {//加入符号位的按钮监听效果
						if (text2.getText().equals("")) {//判断符号位是否为空,若为空则将其设置为加号
							text2.setText(button.getText());
						}
						if (!text.getText().equals("")) {//判断第一个元素是否有输入值
							if (s1 == 0) {//没有即初始为0时
								s1 = Double.valueOf(text.getText());//让s1获取到输入的值,用来判断第一次计算
								text2.setText(button.getText());//将符号位加入符号
							} else {
								s2 = Double.valueOf(text.getText());//如果不是第一次计算,则让输入的值放到s2中
							}
							if (!text2.getText().equals("")) {
								switch (text2.getText()) {//判断符号位是否有符号,并对其进行上一次的计算
								case "%":
									if (s2 != 0) {
										re = s1 % s2;
										s1 = re;
									} else {
										re = s1;
									}
									text.setText("");
									s2 = 0;
									text1.setText(String.valueOf(re));
									text2.setText(button.getText());
									break;
								case "-":
									re = s1 - s2;
									s1 = re;
									text.setText("");
									s2 = 0;
									text1.setText(String.valueOf(re));
									text2.setText(button.getText());
									break;
								case "*":
									if (s2 != 0) {
										re = s1 * s2;
										s1 = re;
									} else {
										re = s1;
									}
									text.setText("");
									s2 = 0;
									text1.setText(String.valueOf(re));
									text2.setText(button.getText());
									break;
								case "/":
									if (s2 != 0) {
										re = s1 / s2;
										s1 = re;
									} else {
										re = s1;
									}
									text.setText("");
									s2 = 0;
									text1.setText(String.valueOf(re));
									text2.setText(button.getText());
									break;
								case "√":
									re = Math.sqrt(s1);
									s1 = re;
									text.setText("");
									s2 = 0;
									text1.setText(String.valueOf(re));
									text2.setText(button.getText());
									break;
								default:
									break;
								}
							}
						}
						if (s2 != 0) {
							s1 = Double.valueOf(text1.getText());
							re = s1 + s2;
							s1 = re;
							text.setText("");
							s2 = 0;
							text1.setText(String.valueOf(re));
						} else {
							text.setText("0");
							text1.setText(String.valueOf(s1));
						}
					} // 加法
				}

				@Override
				public void widgetDefaultSelected(SelectionEvent arg0) {
					// TODO Auto-generated method stub

				}
			});
		}

以上是加法的计算,其他符号算法类同。
接下来是小数点的判断

				if (button2.getText().equals(".")) {
						boolean x = true;
						for (int i = 0; i < text.getText().length(); i++) {
							if (text.getText().charAt(i) == '.') {
								x = false;
							}
						}//判断小数点是否重复出现
						if (x) {
							text.setText(text.getText() + ".");//没有则可以加入
						}
					}

到此计算器的功能基本已经完全实现。