直接上源码:

//
//

import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class Calculator extends java.applet.Applet implements ActionListener
{
	//界面组件
	private Button m_btnNum[]=new Button[10];
	private Button m_btnAdd=new Button("+");
	private Button m_btnSub=new Button("-");
	private Button m_btnMul=new Button("*");
	private Button m_btnDiv=new Button("/");
	private Button m_btnEqu=new Button("=");
	private Button m_btnClr=new Button("clr");
	private TextField m_textDisplay=new TextField(20);
	private String m_strInfo=new String();
	private int i;

	//界面布局,加入事件监听器
	public void init()
	{
		setName("计算器");
		for(i=0;i<=9;i++)
		{
			m_btnNum[i]=new Button(/*"%d",i*/Integer.toString(i));
		}
		setLayout(new BorderLayout());
		add("North",m_textDisplay);
		m_textDisplay.setEditable(false);
		Panel panelBody=new Panel();
		panelBody.setLayout(new GridLayout(4,4));
		for(i=1;i<=9;i++)
		{
			panelBody.add(m_btnNum[i]);
			m_btnNum[i].addActionListener(this);
		} 
		panelBody.add(m_btnNum[0]);m_btnNum[0].addActionListener(this);
		panelBody.add(m_btnClr);m_btnClr.addActionListener(this);
		panelBody.add(m_btnEqu);m_btnEqu.addActionListener(this);
		panelBody.add(m_btnAdd);m_btnAdd.addActionListener(this);
		panelBody.add(m_btnSub);m_btnSub.addActionListener(this);
		panelBody.add(m_btnMul);m_btnMul.addActionListener(this);
		panelBody.add(m_btnDiv);m_btnDiv.addActionListener(this);
		add("Center",panelBody);
		setSize(200,200);

	}
	public void start()
	{

	}

	//将按钮的信息传到显示面板,响应按钮命令
	public void actionPerformed(ActionEvent e)
	{
		if(e.getSource()==m_btnClr)
			m_strInfo="";
		else if(e.getSource()==m_btnAdd)
			m_strInfo+="+";         
		else if(e.getSource()==m_btnSub)
			m_strInfo+="-";
		else if(e.getSource()==m_btnMul)
			m_strInfo+="*";
		else if(e.getSource()==m_btnDiv)
			m_strInfo+="/";
		else if(e.getSource()==m_btnEqu)
		{
			HandleEqu();
			return;
		}
		else 
		{
			String strTemp=e.getSource().toString();
			int nLen=strTemp.lastIndexOf("=");
			m_strInfo+=strTemp.charAt(nLen+1);
		}
		m_textDisplay.setText(m_strInfo);

	}

	//按下等号后的处理事件
	public void HandleEqu()
	{
		try
		{
			String strTemp;
			strTemp=ToTailString(m_strInfo);
			strTemp=CalTailString(strTemp);
			m_strInfo+="=";
			m_strInfo+=strTemp;
			m_textDisplay.setText(m_strInfo);
			m_strInfo="";
		}
		catch(Exception e)
		{
			m_strInfo="";
			System.out.println(e.toString());
			m_textDisplay.setText("ERROR");
		}

	}

	//转化为后缀表达式
	private String ToTailString (String strOrignal)throws Exception
	{

		int top=-1;
		char []Exp=new char[200];
		char []St=new char[200];
		char ch;
		int i=0,t=0;
		boolean bFlag=true;
		int nLen=strOrignal.length();
		if(nLen==0)
			return "";

		ch=strOrignal.charAt(i);
		i++;
		while(i<=nLen&&bFlag)
		{

			switch(ch)
			{

			case '+':
			case '-':
				while(top!=-1)
				{
					Exp[t]=St[top];
					top--;
					t++;
				}
				top++;
				St[top]=ch;
				break;
			case '*':
			case '/':
				while(top!=-1 && (St[top]=='*' || St[top]=='/') )
				{
					Exp[t]=St[top];
					top--;
					t++;
				}
				top++;
				St[top]=ch;
				break;
			default:
				while(ch>='0' && ch<='9')
				{
					Exp[t]=ch; 
					t++;
					if(i>=nLen){bFlag=false;break;}
					ch=strOrignal.charAt(i);
					i++;
				}
				i--;
				Exp[t]='#';
				t++;                
			}
			ch=strOrignal.charAt(i); 
			i++;
			if(i>nLen){bFlag=false;break;}
		}

		while(top!=-1)
		{
			Exp[t]=St顶端;
			t++;
			top--;
		}

		String str1="";
		for(int k=0;k='0' && ch<='9')
				{
					d=10*d+(int)(ch-'0');
					if(t>=nLen){bFlag=false;break;}
					ch=strTail.charAt(t);       
					t++;            
				}
				top++;
				St顶端=d;
				break;
			}
			if(t>=nLen)
			{
				bFlag=false;
				break;
			}
			ch=strTail.charAt(t); 
			t++;

		}
		return Float.toString(St[0]);
	}
}

Ubuntu8.04 + Sun JAVA6环境
编译:
javac Calculator.java

运行结果:
appletviewer Calculator.java

感言:
Java图形界面只能用纯代码来写,比较痛苦。另外本程序计算后缀表达式的算法在《数据结构》课程中已经练习过,虽然我还是不太熟。。。