Java 计算器不允许单一输入

Java calculator not allowing for single inputs

我有一个半完整的 java 计算器,它不能正常工作。每当我点击“1”按钮时,它不允许我添加更多。它允许我点击按钮,但它只显示一个“1”,而不是让我点击它多次并打印出单数。代码是在 NetBeans 中完成的,并且使用了设计部分。 link 我的代码如下:http://pastebin.com/vq9fSA2b

我真的很感激能得到一些帮助,因为它在我的设计中造成了障碍。错误在第 209 行,在 btn1 下。 我还需要在每个部分下添加相同的标准代码部分,但如果没有输入正确的代码,我无法这样做。

监听方法是这样的:

private void btn1ActionPerformed(java.awt.event.ActionEvent evt) {                                    
    String btnOneText = btn1.getText( );
    txtDisplay.setText(btnOneText);
} 

这就是您现在正在做的事情:

  1. 获取按钮上显示的文本(大概是“1”)
  2. 正在将计算器的状态设置为该文本。

这里缺少一些东西 - 您没有在此侦听器方法中保留计算器的状态(先前输入的输入)。

此代码在操作输入之前保存输入的状态,并将其附加到末尾。

private void btnActionPerformed(java.awt.event.ActionEvent evt) { 
    String inputState = txtDisplay.getText(); 
    txtDisplay.setText(inputState + ((JButton) evt.getSource()).getText()); 
}

编辑:修复了演员表周围的括号。

尽管 post 不是很清楚,但我想您正在尝试在单击新按钮时编写数字条目。

您应该拉取当前的 txtDisplay 内容,然后将新的关键文本附加到其中,而不是在每次单击按钮时都将其删除:

private void btn1ActionPerformed(java.awt.event.ActionEvent evt)
{                                    
    String btnOneText = btn1.getText();
    String oldTextEntry = txtDisplay.getText();
    txtDisplay.setText(oldTextEntry + btnOneText);
} 

在第 210 行你有:

txtDisplay.setText(btnOneTxt);

所做的是将 JTextField txtDisplay 的 全部内容 设置为 btnOneTxt。因此,每次单击按钮时,都会将 txtDisplay 中已有的内容替换为 btnOneTxt。

您要做的是使用按钮文本附加到文本字段中已有的内容,如下所示

txtDisplay.setText(txtDisplay.getText() + btnOneText);

顺便提一下,您的 GUI 代码真的很乱。我不确定你写了多少或给了你多少来提示作业,但你可以考虑将按钮存储在一个数组中,这样你就可以在所有按钮上循环执行相同的功能。

setText 就是这样做的,它将您提供给该字段的文本设置为丢弃之前存在的文本

您可以通过多种方式附加文本...

你可以...

进行简单的 String 连接...

String btnOneText = btn1.getText();
btnOneText = txtDisplay.getText() + btnOneText;
txtDisplay.setText(btnOneText);

你可以...

使用 StringBuilder 并在每次按下其中一个按钮时附加文本...

private StringBuilder displayText = new StringBuilder(128);
//...
displayText.append(btnText);
txtDisplay.setText(displayText);

你可以...

将文本直接插入底层 Document 本身...

try {
    Document doc = txtDisplay.getDocument();
    doc.insertString(doc.getLength(), btnText, null);
} catch (BadLocationException exp) {
    exp.printStackTrace();
}

此方法不需要您将基础 Document 的值提取到 String、更新 String(即连接它)然后重新应用 String 回到 Document,它将 String 直接注入底层 Document,这通常更有效