照例先介绍一下各M运算符的操作:
MC:清空存储器的内容,显示区存在的M标志会消失。
MR:读取存储器的内容到显示区。
MS:将显示区的内容写入存储器中。显示区将出现M标志。
M+、M-:对存储器的数值进行加法(减法)运算。如果存储器记录了数值(显示区出现M标志),则点击M+(M-)后会将存储器中的数值加上(减去)显示区的数值;否则功能相当于MS。
我在Moperation类中设置了memory的double变量和isMemoryFilled的boolean变量,以记录存储器是否存储了数值,以及存储器的数值大小。
这里需要讲讲如何在JtextField上添加M标志。首先先创建一个文本为M的JLabel,然后就考虑如何将JLabel放到JTextField的上面。一开始我是在显示区的面板上用了setComponentZOrder()函数来设置控件的上下层关系,但是这样做的话,当显示区的文本发生变化时,M标志就会被覆盖掉。最后才发现可以直接使用add()方法将M标志加到显示区上,再用setBounds调好位置和大小即可。注意,这里不能设置布局。效果如下图所示:
做好这个之后剩下的处理就简单了,代码如下:
publicstatic String MOperationAction(String text, int index) {
switch (index) {
case Button.MR:
return isMemoryFilled ? resultFormat(memory): "0";
case Button.MS:
if (!text.equals("0")) {
memory_sign.setVisible(true);
memory = Double.parseDouble(text);
isMemoryFilled = true;
isResult = true;
} else {
memory = Double.parseDouble(text);
}
return text;
case Button.MC:
memory_sign.setVisible(false);
isMemoryFilled = false;
return text;
case Button.MPLUS:
if (!text.equals("0")) {
memory_sign.setVisible(true);
memory = isMemoryFilled ? memory +Double.parseDouble(text)
: Double.parseDouble(text);
isMemoryFilled = true;
isResult = true;
}
return text;
case Button.MMINUS:
if (!text.equals("0")) {
memory_sign.setVisible(true);
memory = isMemoryFilled ? memory -Double.parseDouble(text)
: Double.parseDouble(text);
isMemoryFilled = true;
isResult = true;
}
return text;
default:
return "";
}
}
M运算符的处理也到此完成。