有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

swing Java显示字段拒绝清除

我正在开发一个计算器应用程序(为了便于调试,我简化了它)。当用户点击“=”时,IMPORTANTINT将更改为1。当用户单击另一个按钮时,应使用CalculatorEngine中的if-then语句清除该字段:

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

这样用户就可以查看结果,然后开始新的计算。文本字段不想清除。有人知道这是为什么吗?谢谢

计算引擎。爪哇

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

计算器。爪哇

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

}


共 (2) 个答案

  1. # 1 楼答案

    public void setDisplayValue(String val){
        SwingUtilities.invokeLater(new Runnable{
            @Override
        public void run()
        {
                displayField.setText(val);
            }
        });
    }
    
  2. # 2 楼答案

    在进入IMPORTANTINTif语句块之前,您正在有效地缓存dispFieldText。因此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(一个boolean通常处理一个true/false场景)