-1

私は電卓アプリケーションに取り組んでいます(デバッグを容易にするために簡略化しました)。ユーザーが「=」を押すと IMPORTANTINT が 1 に変わります。ユーザーが別のボタンをクリックすると、フィールドは CalculatorEngine の if then ステートメントでクリアされるはずです。

        if(IMPORTANTINT == 1){
        System.out.println("Ran the block of code");
        parent.setDisplayValue("");
        IMPORTANTINT = 0;
        System.out.println(IMPORTANTINT);
    }

これは、ユーザーが結果を表示してから新しい計算を開始できるようにするためです。textField はクリアしたくありません。これがなぜなのか誰か知っていますか?ありがとう!

電卓エンジン.java

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JOptionPane;
import javax.swing.JButton;

public class CalculatorEngine implements  ActionListener{
Calculator parent;
double firstNum, secondNum;
String symbol;
int IMPORTANTINT = 0;
CalculatorEngine(Calculator parent){
    this.parent = parent;   
}
public void actionPerformed(ActionEvent e){
    JButton clickedButton = (JButton) e.getSource();
    String clickedButtonLabel = clickedButton.getText();
    String dispFieldText = parent.getDisplayValue();
    if(IMPORTANTINT == 1){
        System.out.println("Ran the block of code");
        parent.setDisplayValue("");
        IMPORTANTINT = 0;
        System.out.println(IMPORTANTINT);
    }
    if(clickedButtonLabel == "+"){
        firstNum = (Double.parseDouble(parent.getDisplayValue()));
        parent.setDisplayValue("");
        symbol = clickedButtonLabel;
    } else if(clickedButtonLabel == "="){
        IMPORTANTINT = 1;
        secondNum = Double.parseDouble(parent.getDisplayValue());
        double answer = firstNum + secondNum;
        parent.setDisplayValue(Double.toString(answer));
    } else{     


        parent.setDisplayValue(dispFieldText + clickedButtonLabel);
    }
}   

電卓.java

import javax.swing.*;

import java.awt.GridLayout;
import java.awt.BorderLayout;

public class Calculator {
private JPanel windowContent;
private JPanel p1;
private JPanel sideBar;

private JTextField displayField;
private JButton button8;
private JButton button9;
private JButton buttonEqual;
private JButton buttonPlus;
Calculator(){
  windowContent= new JPanel();
  BorderLayout bl = new BorderLayout(); 
  windowContent.setLayout(bl);
  displayField = new JTextField(30);
  windowContent.add("North",displayField);

  button8=new JButton("8");
  button9=new JButton("9");
  buttonEqual=new JButton("="); 
  buttonPlus = new JButton("+");

  p1 = new JPanel();
  GridLayout gl =new GridLayout(4,3); 
  p1.setLayout(gl);

  sideBar = new JPanel();
  GridLayout gl2 = new GridLayout(5,1); 
  sideBar.setLayout(gl2);
  p1.add(button8);
  p1.add(button9);
  p1.add(buttonEqual); 

sideBar.add(buttonPlus);
  windowContent.add("Center", p1);
  windowContent.add("East", sideBar);

JFrame frame = new JFrame("Calculator");
frame.setContentPane(windowContent);

frame.pack(); 
frame.setVisible(true);
CalculatorEngine calcEngine = new CalculatorEngine(this);

button8.addActionListener(calcEngine);
button9.addActionListener(calcEngine);
buttonEqual.addActionListener(calcEngine);
buttonPlus.addActionListener(calcEngine);

}
public void setDisplayValue(String val){
    displayField.setText(val);
}
public String getDisplayValue(){
    return displayField.getText();
}    
public static void main(String[] args) 
{
    Calculator calc = new Calculator();
}       

}

4

2 に答える 2

0

if ステートメント ブロックに入るdispFieldText に効果的にキャッシュしています。IMPORTANTINTしたがって、JTextFieldはクリアされますが、その後、elseブロック内のキャッシュされた値になります。

if (IMPORTANTINT == 1) {
   dispFieldText = ""; // add this
   ...
} 

if (clickedButtonLabel.equals("+")) {
  ...
} else if (clickedButtonLabel.equals("=")) {
  ...
} else {
   // Field being reset here vvvv
   parent.setDisplayValue(dispFieldText + clickedButtonLabel);
}

変数を必ずクリアしてください。String#equals内容確認にご利用くださいString==オペレーターが参照をチェックしますObject

余談: Java 命名規則を使用してください。IMPORTANTINT変更可能な変数なので、そうする必要がありますimportantInt(Abooleanは通常、true/falseシナリオを処理します) 。

于 2013-05-16T16:34:02.857 に答える
0
public void setDisplayValue(String val){
    SwingUtilities.invokeLater(new Runnable{
        @Override
    public void run()
    {
            displayField.setText(val);
        }
    });
}
于 2013-05-16T16:35:08.963 に答える