2013-05-16 5 views
-1

Я работаю над приложением калькулятора (которое я упростил, чтобы упростить его отладку). Когда пользователь попадает «=» IMPORTANTINT изменится на 1. Когда пользователь нажимает другую кнопку поле предполагается очистить с, если потом заявление в CalculatorEngine:Java displayField отказывается очищать

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

Это делается таким образом, пользователь может просмотреть и затем начать новый расчет. TextField не хочет очищать. Кто-нибудь знает, почему это? Благодаря!

CalculatorEngine.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); 
    } 
} 

Calculator.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(); 
}  

}

+1

вы понять, ваша строка Comparision неправильно. – PermGenError

+0

Какой файл/метод вы тоже имеете в виду? – James

+0

'int IMPORTANTINT = 0;' Если это 'IMPORTANT_INT', он должен быть константой, для чего-то, что не является константой, его следует называть' importantInt' (& no, нет необходимости делать его в верхнем регистре только для наша польза). –

ответ

0

Вы эффективно кэшировать 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 (A boolean обычно обрабатывает true/false сценарий)

+0

Если бы я сделал это, пользователю не пришлось бы дважды нажать кнопку? Один раз, чтобы очистить поле, и один, чтобы добавить еще один номер. – James

+0

Спасибо! Это прекрасно работает. Вы знаете, почему оригинальный способ не работал? – James

+0

Это подробно объяснено выше. В основном вы кэшировали 'dispFieldText' и всегда устанавливали старое значение в блоке' else' – Reimeus

0
public void setDisplayValue(String val){ 
    SwingUtilities.invokeLater(new Runnable{ 
     @Override 
    public void run() 
    { 
      displayField.setText(val); 
     } 
    }); 
} 
Смежные вопросы