计算器Applet
本章介绍了两个解析器,它们的使用非常简单,几乎可以用于任何应用程序。下面的例子可用来说明解析器的使用方法。这个例子只用几行代码就创建了一个功能齐全的计算器Applet。该计算器使用两个文本框:第一个用于接收需要计算的表达式;第二个用于显示计算结果。其中后者是一个只读文本框。而错误消息显示在状态栏上。示例运行的输出结果(使用Applet Viewer)如图2-1所示。
// A simple calculator applet.
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
/*
<applet code="Calc" width=200 height=150>
</applet>
*/
public class Calc extends Applet
implements ActionListener {
TextField expText, resText;
Parser p;
public void init() {
Label heading = new
Label("Expression Calculator ", Label.CENTER);
Label explab = new Label("Expression ", Label.CENTER);
Label reslab = new Label("Result ", Label.CENTER);
expText = new TextField(24);
resText = new TextField(24);
resText.setEditable(false); // result field for display only
add(heading);
add(explab);
add(expText);
add(reslab);
add(resText);
/* Register expression text field
to receive action events. */
expText.addActionListener(this);
// create parser
p = new Parser();
}
// User pressed Enter.
public void actionPerformed(ActionEvent ae) {
repaint();
}
public void paint(Graphics g) {
double result = 0.0;
String expstr = expText.getText();
try {
if(expstr.length() != 0)
result = p.evaluate(expstr);
// To clear expression after ENTER is pressed
// use the folloing line:
// expText.setText("");
resText.setText(Double.toString(result));
showStatus(""); // erase any previous error message
} catch (ParserException exc) {
showStatus(exc.toString());
resText.setText("");
}
}
}
图2-1 一个简单实用的计算器Applet
Calc类首先声明3个实例变量,分别保存3个引用。第一个是expText,指向输入表达式的文本框组件;第二个是resText,指向显示计算结果的文本框组件;而指向解析器的引用保存在变量p中。
Calc类的init()方法创建两个文本框并将它们添加到Applet中,然后为expText文本框注册一个侦听器。用户每次输入回车时,文本框都将产生一个事件。由于显示结果的文本框resText只用于显示计算结果,因此在init()中调用setEditable(false)方法,将其设置为只读属性。经过这样的设置后,显示结果的文本框从外观上看呈现灰色,并且不再响应用户的输入。init()方法最后初始化了一个Parser实例并赋给变量p。使用计算器时,用户只需输入表达式,然后回车。程序会产生一个ActionEvent事件,并调用actionPerformed()方法来处理该事件。接着actionPerformed()方法先调用repaint()方法,最后调用paint()方法。在paint()方法中,解析器执行计算过程,得出表达式的结果,并显示在结果显示文本框中。注意:所有的错误都显示在状态栏中。
|