少了瀏覽器的支持,Applet在互聯網上永遠不會有自己的舞臺,而我卻很酷愛這種把應用程序放到界面里的東東,今天無聊,把以前寫過的一個表達式求值的程序,順手拿Applet改寫一下,再讓大家體驗一下MVC設計模式的應用吧:
=======================ExpressionModel===================
/*
?*這個就是表達式的模型組件了,它的三個屬性,分別代表了它的中則表達式和右則表達式
?*而那兩個屬性分別是輸入的式子和得到的結果
?*/
package expression;
import java.text.*;
import java.util.*;
public class ExpressionModel extends Observable
{
?
?private ArrayList<String> middle;
?private ArrayList<String> right;
?private String input, result;
?public ExpressionModel()
?{
??middle = new ArrayList<String>();
??right = new ArrayList<String>();
?}
?//判斷一個字符是不是操作符
?private boolean isOperator( String op )
?{
??if( op.equals("+") || op.equals("-") || op.equals("%")
???? ||op.equals("*")|| op.equals("/") || op.equals("(")
???? ||op.equals(")") )
??? return true;
???
??else return false;
?}
?//得到一個操作符的優先級
?private int priority( String op )
?{
??if( op.equals("+") || op.equals("-") || op.equals("(") )
???return 1;
??else if( op.equals("*") || op.equals("/") || op.equals("%") )
???return 2;
??else
???return 0;
?}
?
//計算兩個數和一個運算符得到的結果
?private String calTwoNumber( String op, String a, String b ) throws Exception
?{
??double x = Double.parseDouble( b );
??double y = Double.parseDouble( a );
??double z = 0;
??
??if( op.equals("+") )
???z = x + y;
??else if( op.equals("-") )
???z = x - y;
??else if( op.equals("*") )
???z = x * y;
??else if( op.equals("/") )
???z = x / y;
??else if( op.equals("%") )
???z = x % y;
??else
???z=0;
??
??return Double.toString( z );
?}
?
//將我們輸入的中則表達式轉換成逆波蘭式
?private void turnToRight()
?{
??MyStack stack = new MyStack();
??String op;
??int pos = 0;
??
??StringTokenizer st = new StringTokenizer(input,"+-*/%()",true);
??
??while( st.hasMoreElements() )
???middle.add( st.nextToken() );
??
??while(true)
??{
???if( isOperator( middle.get(pos) ) )
???{
????if( stack.getTop() == -1 || (middle.get(pos)).equals("(") )
????{
?????stack.push( middle.get(pos) );
????}
????else
????{
?????if( (middle.get(pos)).equals(")") )
?????{
??????if( !(stack.top()).equals("(") )
??????{
???????op = stack.pop();
???????right.add(op);
??????}
?????}
?????else
?????{
??????if( priority(middle.get(pos)) <= priority(stack.top()) && stack.getTop() != -1 )
??????{
???????op = stack.pop();
???????if( !op.equals("(") )
????????right.add(op);
??????}
??????stack.push( middle.get(pos) );
?????}
????}
???}
???else
????right.add( middle.get(pos) );
???pos++;
???if( pos >= middle.size() )
????break;
??}
??
??while( stack.getTop() != -1 )
??{
???op = stack.pop();
???right.add(op);
??}
?}
?private void calculate( String expression ) throws Exception
?{
??input = expression;
??
??turnToRight();
??
??MyStack stack = new MyStack();
??String op1, op2, is = null;
??Iterator<String> it = right.iterator();
??
??while(it.hasNext())
??{
???is = it.next();
???if( isOperator(is) )
???{
????op1 = stack.pop();
????op2 = stack.pop();
????stack.push( calTwoNumber(is,op1,op2) );
???}
???else stack.push(is);
??}
??
??NumberFormat form = NumberFormat.getInstance();
??form.setMaximumFractionDigits(5);
??
??result = input + "=" + form.format( Double.parseDouble( stack.pop() ) );
??
??setChanged();
??notifyObservers();
?}
?
?public void input(String expression) throws Exception
?{
??calculate(expression);
??middle.clear();
??right.clear();
?}
?
?public String getResult(){
??return result;
?}
?
}
===============MyStack==============
//我們用到的自己的堆棧
package expression;
import java.util.*;
public class MyStack
{
?
?private LinkedList<String> list;
?private int top;
?
?public MyStack()
?{
??list = new LinkedList<String>();
??top = -1;
?}
??
?public void push(String value)
?{
??top++;
??list.addFirst(value);
?}
?
?public String pop()
?{
??String temp = list.getFirst();
??top--;
??list.removeFirst();
??return temp;
?}
?
?public String top()
?{
??return list.getFirst();
?}
?
?public int getTop()
?{
??return top;
?}
?
}
===============ExpressionController========------
//控制器組件,包括一個輸入域和兩個按紐
package expression;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ExpressionController extends JPanel
{
?
?private ExpressionModel expressionModel;??
?private JTextField calTextField;
?
?public ExpressionController( ExpressionModel controllerModel ) {
??
??super();
??
??expressionModel = controllerModel;
??
??calTextField = new JTextField( 15 );
??JButton calButton = new JButton( "計算" );
??JButton delButton = new JButton( "取消" );
??
??calButton.addActionListener(
???new ActionListener()
???{
????public void actionPerformed( ActionEvent event )
????{
?????try
?????{
??????expressionModel.input( calTextField.getText() );
??????calTextField.setText("");
?????}
?????catch ( Exception exception )
?????{
??????JOptionPane.showMessageDialog (
???????ExpressionController.this,
???????"請輸入有效表達式!", "錯誤",
???????JOptionPane.ERROR_MESSAGE );
??????calTextField.setText("");
?????}
????}
???}
??);
??
??delButton.addActionListener(
???new ActionListener()
???{
????public void actionPerformed( ActionEvent event )
????{
?????try
?????{
??????calTextField.setText("");
?????}
?????catch ( Exception exception )
?????{
??????calTextField.setText("");
?????}
????}
???}
??);
??
??setLayout( new FlowLayout() );
??
??add( calTextField );
??add( calButton );
??add( delButton );
?
?}
?
?public Dimension getPreferredSize()
?{
??return new Dimension( 320, 40 );
?}
?
?public Dimension getMinimumSize()
?{
??return getPreferredSize();
?}
?
?public Dimension getMaximumSize()
?{
??return getPreferredSize();
?}
?
}
================ExpressionView ==================
//用來顯示結果的視圖
package expression;
import java.awt.*;
import java.text.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
public class ExpressionView extends JPanel implements Observer
{
?
?private ExpressionModel expressionModel;
?private JLabel display = new JLabel();
?
?public ExpressionView( ExpressionModel model ) {
??
??if( model == null )
???throw new NullPointerException();
??
??expressionModel = model;
??expressionModel.addObserver( this );
??
??add( display );
??
??setBackground( Color.white );
??setBorder( new MatteBorder( 1, 1, 1, 1, Color.black ) );
??
?}
?
?public void update( Observable observable, Object object )
?{
??display.setText( expressionModel.getResult() );
?}
?
?public Dimension getPreferredSize()
?{
??return new Dimension( 320, 60 );
?}
?
?public Dimension getMinimumSize()
?{
??return getPreferredSize();
?}
?
?public Dimension getMaximumSize()
?{
??return getPreferredSize();
?}
?
?
}
===================Expression=====================
//最后把這些組裝到這里吧
package expression;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class Expression extends JApplet
{
??
?public void init()
?{
??ExpressionModel model = new ExpressionModel();
??ExpressionView view = new ExpressionView( model );
??ExpressionController controller = new ExpressionController( model );
??
??Container contentPane = getContentPane();
??contentPane.add( view, BorderLayout.CENTER );
??contentPane.add( controller, BorderLayout.SOUTH );
??
??setSize( 320, 100 );
??
?}
??
}
把這幾個類打包到一個jar文件后,再創建個htm文件來訪問它
<object
??? classid = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
??? codebase = "??? WIDTH = 320 HEIGHT = 100 >
??? <PARAM NAME = CODE VALUE = "expression.Expression" >
??? <PARAM NAME = ARCHIVE VALUE = "expression.jar" >
??? <param name = "type" value = "application/x-java-applet;version=1.5">
??? <param name = "scriptable" value = "false">
</object>
這樣就行了,不過你的機器需要安裝jre 5