我是Java和OOP的新手。 我正在尝试使用Java Swing创建一个简单的计算器。 如果没有添加点,我希望用户在第一个之后无法输入零。 我已经集思广益了很多时间,我无法找到解决方案:( 现在,如果只输入一个数字(不同于0),则无法输入0。 适用于其他所有情况。
以下是我的代码的一部分:
public class Calculator extends JFrame implements ActionListener {
boolean hasDot = false;
boolean hasNull = false;
JButton button0;
JButton buttonDot;
JTextArea text;
public Calculator(){
//Constructor comes here
button0 = new JButton("0");
buttonDot = new JButton(".");
text = new JTextArea(1, 20);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button0) {
if (text.getText().length() > 0)
hasNull = true;
if (hasNull == false) {
text.append("0");
hasNull = true;
}
if (hasNull == true && hasDot == true) {
hasNull = false;
text.append("0");
}
if (text.getText().length() > 1 && hasDot == false)
text.append("0");
}
if (e.getSource() == buttonDot && (hasDot == false)
&& text.getText().length() != 0) {
text.append(".");
hasDot = true;
hasNull = false;
}
}
}
答案 0 :(得分:0)
我认为这样可以解决问题。您可能希望避免让JFrame成为动作侦听器。它使代码更难阅读。您还需要实现两个函数isNextDigitAfterDecimalPoint
和getButtonNumber
,但它们不应该太难。这些将使您的代码更容易推理。
public Calculator() {
//Constructor comes here
button0 = new JButton("0");
button0.addActionListener(mNumberButtonActionListener);
// other buttons ...
buttonDot = new JButton(".");
buttonDot.addActionListener(mDotButtonActionListener);
text = new JTextArea(1, 20);
}
private ActionListener mNumberButtonActionListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
int numberToAppend = getButtonNumber(e.getSource());
if (isNextDigitAfterDecimalPoint()) {
text.append(Integer.toString(numberToAppend))
} else {
String currentNumberText = text.getText()
if (currentNumberText.size() == 0 || !currentNumberText.get(0).equals("0")) {
text.append(Integer.toString(numberToAppend));
}
}
}
}
private boolean isNextDigitAfterDecimalPoint() { ... }
private int getButtonNumber(JButton button) { ... }
private ActionListener mDotButtonActionListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (isNextDigitAfterDecimalPoint()) {
text.append(".");
}
}
}
您可能还想考虑的一件事是您的hasNull和hasDot变量并不是必需的。它们会为您的应用程序添加额外状态您可以使用解释文本字段内容的方法获取这两个值。这样,您就不必记住在文本更改时更新它们。
例如。
boolean hasDot() {
return text.getText().contains(".");
}