计算器
运用Java语言和NetBeans工具设计一个简易的计算器,计算器看似简单,其中各种功能的实现需要涉及很多知识点,下面我来简单的阐述一下设计计算器的步骤以及遇到的一些问题。
一、设计计算器的步骤
1、打开NetBeans,文件-新建-在类别中选择Java-下一步-写上项目名(caculator)选择项目位置-点击完成。
2、选中caculator包右击,新建-JFrame窗体,在设计界面设计计算器的界面,步骤如下:先放入一个拆分窗格,然后依次放入一个文本字段和十八个按钮,布局好后,分别选中按钮,右击设置按钮的变量名称和按钮上的文本,设置完如下图。
3、实现计算器各种功能的代码
在JFrame下先创建一个setNum方法,然后依次右击按钮-事件-Mouse-mouseReleased,添加鼠标的释放事件的方法,并在各个按钮的释放事件方法中使用setNum()调用JFrame中的setNum()方法。即可实现点击按钮相应的数字能进入JTextField文本域中。
setNum()方法的代码如下:
//创建setNum方法
public void setNum(String str){
//获得显示文本内容保存到strText
String strText=jTextField1.getText();
//如果文本内容是0,那么改为str,否则追加
if(strText.equals("0")){
jTextField1.setText(str);
}else{ //追加
//使用构造方法初始化StringBuffer,并赋值strText
StringBuffer strBuf=new StringBuffer(strText);
//追加str到当前StringBuffer对象(strText)的末尾
strBuf.append(str); //追加str
//重新设置文本内容为strBuf
jTextField1.setText(strBuf.toString());
// jTextField1.setText(strText+str);
}
}
上面的功能实现后,设置等于的MouseReleased事件的方法,实现点击等于时,将计算结果显示在文本域中。代码如下:
//等于
private void dengyuMouseReleased(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
/*ScriptEngineManager 为 ScriptEngine 类实现一个发现和实例化机制,
还维护一个键/值对集合来存储所有 Manager 创建的引擎所共享的状态。
*/
ScriptEngineManager manager=new ScriptEngineManager();
//查找并创建一个给定名称的 ScriptEngine
ScriptEngine se=manager.getEngineByName("js");
Double result=null;
try {
result=(Double) se.eval("("+jTextField1.getText()+")*1.0");
} catch (ScriptException ex) {
Logger.getLogger(JFrame.class.getName()).log(Level.SEVERE, null, ex);
}
jTextField1.setText(result.toString());
}
4、实现回退的功能,设置回退按钮的MouseReleased事件的方法,该按钮实现当点击该按钮时,文本域中删除一个字符。
代码如下://箭头
private void jiantouMouseReleased(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
//获得显示文本内容保存到strText
String strText=jTextField1.getText();
//判断strText的长度
if(strText.length()>1){
StringBuffer strBuf=new StringBuffer(strText);
//删除指定位置的字符,然后将剩余的内容形成新的字符串。
strBuf.deleteCharAt(strBuf.length()-1);
jTextField1.setText(strBuf.toString());
}else{
jTextField1.setText("0");
}
}
5、实现清空的功能,设置清空按钮的MouseReleased事件的方法,该按钮实现当点击该按钮时,文本域中的字符被清空。
代码如下:
//清空
private void qingkongMouseReleased(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
jTextField1.setText("0");
}
6、规范运算符,在JFrame下先创建一个setYSF()方法,该方法实现当点击一个运算符时,发现点错,想点击正确的运算符能直接实现运算符的切换功能。代码如下:
//规范运算符
public void setYSF(String str){
//取出当前显示的内容放到字符串变量strText中
String strText=jTextField1.getText();
//判断strText中字符串的最右边一位是否为运算符
/* 如果(最右边是运算符){
//替换strText最右边的运算符为当前按键str
//strText放回文本框
}否则{
//strText追加当前的str
//strText放回
}*/
int lastRight=strText.length()-1; //当前字符串的长度-1
char ch=strText.charAt(lastRight); //ch存放最右边的一个字符
if(ch=='+'||ch=='-'|| ch=='*' ||ch=='/'){
//替换strText最右边的运算符为当前按键str,比如"1234","123"
String strResult=strText.substring(0,lastRight)+str;
//strText,strResult放回文本框
jTextField1.setText(strResult);
}else{
//strText追加当前的str
//strText放回
jTextField1.setText(strText+str);
}
}
7、美化计算器的界面。为了计算器的外观更美观, 可以给计算器添加背景图片。步骤如下:
在JFrame-导航器中,选中JFrame,右击 从组件面板上添加-Swing容器-分层窗格、面板1和面板2。将计算器中的组件放入面板1中,将图片放入面板2中。在面板2中添加jLabel,选中jLabel右击属性,找到icon-点击-弹出如下的界面
选择外部图像,将提前找好的图片导入到项目中,然后选择项目内的图像,选中图像。回到设计界面,分别设置分层窗体、面板1、面板2和图片的大小。设置完成后,运行项目,如下图:
8、附加功能:在此基础上,为了使鼠标经过按钮时变色,分别给按钮添加了MouseExited和MouseEntered的事件,在JFrame下先创建 mouseEnter和mouseExited方法,鼠标进入按钮和离开按钮时分别调用这两个方法,代码如下:
public void mouseEnter(int color){
JButton b[]=new JButton[]
{zero,one,two,three,four,five,six,serven,eight,nine,point,jia,jian,cheng,chu,jiantou,qingkong,dengyu};
for(int i = 0;i<b.length;i++){
b[i].setBackground(Color.YELLOW);
}
//one.setBackground(Color.orange);
}
public void mouseExited(int color){
JButton b[]=new JButton[]
{zero,one,two,three,four,five,six,serven,eight,nine,point,jia,jian,cheng,chu,jiantou,qingkong,dengyu};
for(int i = 0;i<b.length;i++){
b[i].setBackground(Color.getColor(""));
}
// one.setBackground(Color.getColor(""));
}
该方法实现实现了当鼠标进入其中任何一个按钮时,所有的按钮变色,当离开按钮时,按钮恢复为原来的颜色。
二、问题总结
在开始设计计算器的时候,认为计算器很简单,但当实际操作时,会发现很多问题。比如在一开始的界面设计时,按钮的位置和大小的调整,这个地方要很有耐心的调整按钮到合适的位置。在实现计算器的功能时,学到了很多新的知识,比如StringBuffer类的使用:StringBuffer对象的初始化
StringBuffer对象的初始化不像String类的初始化一样,Java提供的有特殊的语法,而通常情况下一般使用构造方法进行初始化。
例如:StringBuffer s = new StringBuffer();
这样初始化出的StringBuffer对象是一个空的对象。
如果需要创建带有内容的StringBuffer对象,则可以使用:
StringBuffer s = new StringBuffer(“abc”);
这样初始化出的StringBuffer对象的内容就是字符串”abc”。
需要注意的是,StringBuffer和String属于不同的类型,也不能直接进行强制类型转换,下面的代码都是错误的:
StringBuffer s = “abc”; //赋值类型不匹配
StringBuffer s = (StringBuffer)”abc”; //不存在继承关系,无法进行强转
StringBuffer对象和String对象之间的互转的代码如下:
String s = “abc”;
StringBuffer sb1 = new StringBuffer(“123”);
StringBuffer sb2 = new StringBuffer(s); //String转换为StringBuffer
String s1 = sb1.toString(); //StringBuffer转换为String
总之,在设计过程中遇到了很多问题也学到了一些类和方法的使用,我觉得这对以后的学习会有很大的帮助。当然,我会再接再厉,努力掌握好基础知识,才能在以后的项目设计中更轻松。