posts - 14, comments - 22, trackbacks - 0, articles - 4
            BlogJava :: 首頁(yè) ::  :: 聯(lián)系 :: 聚合  :: 管理

          少了瀏覽器的支持,Applet在互聯(lián)網(wǎng)上永遠(yuǎn)不會(huì)有自己的舞臺(tái),而我卻很酷愛這種把應(yīng)用程序放到界面里的東東,今天無(wú)聊,把以前寫過(guò)的一個(gè)表達(dá)式求值的程序,順手拿Applet改寫一下,再讓大家體驗(yàn)一下MVC設(shè)計(jì)模式的應(yīng)用吧:


          =======================ExpressionModel===================

          /*
          ?*這個(gè)就是表達(dá)式的模型組件了,它的三個(gè)屬性,分別代表了它的中則表達(dá)式和右則表達(dá)式
          ?*而那兩個(gè)屬性分別是輸入的式子和得到的結(jié)果
          ?*/
          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>();
          ?}

          ?//判斷一個(gè)字符是不是操作符
          ?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;
          ?}

          ?//得到一個(gè)操作符的優(yōu)先級(jí)
          ?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;
          ?}
          ?

          //計(jì)算兩個(gè)數(shù)和一個(gè)運(yùn)算符得到的結(jié)果
          ?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 );
          ?}
          ?
          //將我們輸入的中則表達(dá)式轉(zhuǎn)換成逆波蘭式
          ?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========------

          //控制器組件,包括一個(gè)輸入域和兩個(gè)按紐

          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( "計(jì)算" );
          ??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,
          ???????"請(qǐng)輸入有效表達(dá)式!", "錯(cuò)誤",
          ???????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 ==================
          //用來(lái)顯示結(jié)果的視圖
          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 );
          ??
          ?}
          ??
          }

          把這幾個(gè)類打包到一個(gè)jar文件后,再創(chuàng)建個(gè)htm文件來(lái)訪問(wèn)它

          <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>

          這樣就行了,不過(guò)你的機(jī)器需要安裝jre 5


          評(píng)論

          # re: 用Applet實(shí)現(xiàn)表達(dá)式求值  回復(fù)  更多評(píng)論   

          2006-08-12 20:20 by java技術(shù)
          不錯(cuò) 繼續(xù)努力

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          有事在這里給我留言噢!
          主站蜘蛛池模板: 抚顺县| 合肥市| 襄汾县| 江门市| 政和县| 明水县| 灵台县| 老河口市| 海丰县| 佛山市| 彭山县| 夹江县| 花莲县| 大兴区| 德清县| 朝阳市| 新晃| 通江县| 隆昌县| 南澳县| 长泰县| 新巴尔虎左旗| 南昌县| 开原市| 上林县| 卢湾区| 康保县| 田林县| 盖州市| 江陵县| 天祝| 威海市| 闽清县| 桂东县| 斗六市| 呼和浩特市| 河源市| 东兴市| 青神县| 米林县| 多伦县|