2011-08-05 14 views
1

乗算タスクを実行するアクションリスナーを作成しようとしています。しかし、それは入力された最後の数字を無視するようです。最後のコマンドを追跡するために2番目の変数が必要であると思っているので、等価ボタンを押すと、現在の数字が前のコマンドに追加されます。しかし、私はイコールボタンが押されていればタスクを実行する必要はありませんか?Java ActionListener

class ButtonListener implements ActionListener {   
    public void actionPerformed(ActionEvent e) { 
     String numbers = e.getActionCommand(); 
     if (begin) { 
      textField.setText(numbers); 
      begin = false; 
     } 

     else if (numbers.equals("C")) { 
      textField.setText("0.0"); 
      action.reset(); 
     } 

     else 
      textField.setText(textField.getText() + numbers); 
    } 
} 

class OperatorListener implements ActionListener { 

    public void actionPerformed(ActionEvent e) { 
     String command = e.getActionCommand(); 
     String text = textField.getText(); 

     if (begin) { 
      textField.setText("0.0"); 
      action.setTotal("0.0"); 
     } 
     else { 
      if (command.equals("+")) { 
       action.add(text); 
       begin = true; 
      } 
      else if (command.equals("=")) { 
       textField.setText(text); 
       System.out.println(action.getTotal()); 
      } 
      textField.setText(action.getTotal()); 
     } 
    } 
} 

変数の説明。 beginは、単にJTextFieldの現在の状態が空白であるかどうかをチェックします。 actionは、単純に "追加"する方法です、私はそれが欲しい他の呼び出しがあります。

最後の数字を無視しないように、最後のコマンドを追跡したり回避する方法に関する提案はありますか?これらのタスクは電卓のタスクに似ています。


EDIT:興味のある方のために 、ここで私がなってしまったものです。

class ButtonListener implements ActionListener {   
    public void actionPerformed(ActionEvent e) { 
     String numbers = e.getActionCommand(); 

     // check if a number has been pressed 
     if (begin) { 
      textField.setText(numbers); 
      begin = false; 
     } 

     // if clear is checked 
     else if (numbers.equals("C")) { 
      action.reset(); 
      begin = true; 
      operator = "="; 
      textField.setText("0.0"); 
     } 

     // Once a number is pressed keep adding it to the text field until an operator is pressed 

     else 
      textField.setText(textField.getText() + numbers); 
    } 
} 

/** 
* Action listener for Operators 
*/ 

class OperatorListener implements ActionListener { 

    public void actionPerformed(ActionEvent e) { 
     // String command = e.getActionCommand(); 

     // if nothing has been pressed 
     if (begin) { 
      textField.setText("0.0"); 
      begin = false; 

     // else begin performing operation pressed 
     } else { 
      begin = true; 
      String text = textField.getText(); 

      // right away add the value of the text field 
      if (operator.equals("=")) { 
       action.setTotal(text); 
      } 
      else if (operator.equals("+")) { 
       action.add(text); 
      } 
      // and so on for all the other operators. 

      textField.setText("" + action.getTotal()); 

      // now capture the operator pressed. 
      operator = e.getActionCommand(); 
     } 
    } 
} 
+1

for NumberインスタンスのみJFormattedTextField http://download.oracle.com/javase/tutorial/uiswing/components/formattedtextfield.htmlここに示す – mKorbel

+0

「ActionListener」はSwingではなくAWTです。 –

+0

@Andrew:ActionListenerはAWTパッケージに含まれていますが、JButtonにはActionListenerをパラメータとするaddActionListener functinoがあります。したがって、Javaの発明者はSwingプログラムで使用することを期待しているようです。これは私がほとんど常にボタンのクリックを処理する方法です(私はSwingプログラムを書いたときに戻っています)。別の方法がありますか? – Jay

答えて

1

サイドノート:一般に、リスナーを共有しようとするのではなく、ボタンごとに別々のリスナーを作成する方が簡単です。 1つのリスナーを作成すると、最初にいくつかのボタンを1つの機能にまとめてから、それらの機能を分離する必要があります。どうして最初から別々にしておくのではないでしょうか?共通コードがある場合は、共通の関数を呼び出します。

しかし、すべての演算子の優先順位が等しい場合は、演算子を保存してください。次のように:

class Calculator 
{ 
    // Well, this would probably better be an enum, but whatever. 
    public char operator=' '; 
    public float lastNum; 

    public void calc() 
    { 
    try 
    { 
     double currNum=Double.parseDouble(numfield.getText()); 
     if (operator==' ') 
     lastNum=currNum; 
     else if (operator=='+') 
     lastNum+=currNum; 
     else if (operator=='-') 
     lastNum-=currNum; 
     else if (operator=='*') 
     lastNum*=currNum; 
     else if (operator=='/') 
     lastNum/=currNum; 
    } 
    catch (NumberFormatException panic) 
    { 
     ... whatever error handling ... 
    } 
    } 
} 
class OperatorListener implements ActionListener 
{ 
    Calculator calc; 
    public OpeatorListener(Calculator calc) 
    { 
    this.calc=calc; 
    } 
    public abstract void actionPerformed(ActionEvent e); 
} 
class PlusListener extends OperatorListener 
{ 
    public void actionPeformed(ActionEvent e) 
    { 
    calc.calc(); 
    calc.operator='+'; 
    } 
} 
class MinusListener extends OperatorListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
    calc.calc(); 
    calc.operator='-'; 
    } 
} 
class EqualListener extends OperatorListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
    calc.calc(); 
    } 
} 

このコードは、すべての演算子に等しい優先順位を与えます。 "2 + 3 * 5 ="は25になります。

乗算と除算の優先順位を高くしたい場合は、 "2 + 3 * 5 ="を指定すると、スタックを作成し、演算子と一時的な中間値とその他の複雑さを保持する必要があります。

+0

あなたはキャストしてはいけないのですか? 'if(operator == '')lastNum =(float)currNum;'など。私はそれがどのように問題を解決するのかを接続できないと思います。しかし、私はそれを試みます。 – fernan

+0

おっと、私は上記のコードで浮動小数点の使用から二重使用への切り替えを明らかにしていません。それは一貫しているはずです。とにかく、上記のコードのポイント - 私はこれを綴るべきだったと思います。そうでなければそれは大量のコードです - ユーザが操作をクリックすると、テキストボックスを読んで値と操作。ユーザーが等号をクリックすると、もう一度テキストボックスを読み取って2番目の数値を取得し、1番目と2番目の値で保存した操作を実行する必要があります。 – Jay

+0

そして、1 + 2 + 3 =のような計算の実行を許可する場合は、前回の実行値があれば、操作がクリックされるたびに中間値を計算して保存する必要があります。 – Jay

1

あなたはJTextFieldで、オペランドを格納しているとして、取るべきアクションを決定するためにproperty changesdocument changes、またはfocus changesをリッスンするために便利かもしれません。

+0

元の投稿はUIを指定していません。私はそれが数字と+、 - 、*、/、=、そしておそらく他の操作のためのボタンのセットを入力するためのテキストボックスで構成されていると仮定していました。その前提を前提に、ボタンをクリックしたときにのみテキストボックスを処理する必要があります。もちろん、OPには他のUIも念頭に置いているかもしれません。 – Jay

+0

@ジェイ:まさに私の考えです。質問に文脈がなければ、私はあなたのアプローチを補完するものとして私の提案を意図しました。 – trashgod

関連する問題