我有这两个类构成一个简单的计算器,但是当我尝试使用它时,我得到错误java.lang.NumberFormatException,这里是源代码:
SimpleCalc类:
//Imports are listed in full to show what's being used
//could just import javax.swing.* and java.awt.* etc..
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.Container;
public class SimpleCalc implements ActionListener{
public static final SimpleCalc instance = new SimpleCalc();
JFrame guiFrame;
JPanel buttonPanel;
JTextField numberCalc;
int calcOperation = 0;
int currentCalc;
int operatorAction;
//Note: Typically the main method will be in a
//separate class. As this is a simple one class
//example it's all in the one class.
public SimpleCalc()
{
guiFrame = new JFrame();
//make sure the program exits when the frame closes
guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
guiFrame.setTitle("Simple Calculator");
guiFrame.setSize(300,300);
//This will center the JFrame in the middle of the screen
guiFrame.setLocationRelativeTo(null);
numberCalc = new JTextField();
numberCalc.setHorizontalAlignment(JTextField.RIGHT);
numberCalc.setEditable(false);
guiFrame.add(numberCalc, BorderLayout.NORTH);
buttonPanel = new JPanel();
//Make a Grid that has three rows and four columns
buttonPanel.setLayout(new GridLayout(4,3));
guiFrame.add(buttonPanel, BorderLayout.CENTER);
//Add the number buttons
for (int i=1;i<10;i++)
{
addButton(buttonPanel, String.valueOf(i));
}
JButton addButton = new JButton("+");
addButton.setActionCommand("+");
OperatorAction subAction = new OperatorAction(1);
addButton.addActionListener(subAction);
JButton subButton = new JButton("-");
subButton.setActionCommand("-");
OperatorAction addAction = new OperatorAction(2);
subButton.addActionListener(addAction);
JButton equalsButton = new JButton("=");
equalsButton.setActionCommand("=");
equalsButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent event)
{
if (!numberCalc.getText().isEmpty())
{
int number = Integer.parseInt(numberCalc.getText());
if (calcOperation == 1)
{
int calculate = currentCalc + number;
numberCalc.setText(Integer.toString(calculate));
}
else if (calcOperation == 2)
{
int calculate = currentCalc - number;
numberCalc.setText(Integer.toString(calculate));
}
}
}
});
buttonPanel.add(addButton);
buttonPanel.add(subButton);
buttonPanel.add(equalsButton);
guiFrame.setVisible(true);
}
//All the buttons are following the same pattern
//so create them all in one place.
private void addButton(Container parent, String name)
{
JButton but = new JButton(name);
but.setActionCommand(name);
but.addActionListener(this);
parent.add(but);
}
//As all the buttons are doing the same thing it's
//easier to make the class implement the ActionListener
//interface and control the button clicks from one place
@Override
public void actionPerformed(ActionEvent event)
{
//get the Action Command text from the button
String action = event.getActionCommand();
//set the text using the Action Command text
numberCalc.setText(action);
}
public String getText() {
return numberCalc.getText();
}
}
这是另一个类OperatorAction:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JTextField;
public class OperatorAction implements ActionListener
{
int calcOperation = 0;
int currentCalc;
private int operator;
// How to make
public OperatorAction(int operation)
{
operator = operation;
}
public void actionPerformed(ActionEvent event)
{
currentCalc = Integer.parseInt(SimpleCalc.instance.getText());
calcOperation = operator;
}
}
所以我确实认为这是我的getText方法失败了,但为什么呢?我真的不明白为什么这不起作用:/
答案 0 :(得分:0)
只需将您的操作类更改为:
public class OperatorAction implements ActionListener
{
int calcOperation = 0;
int currentCalc;
private int operator;
// How to make
public OperatorAction(int operation)
{
operator = operation;
}
public void actionPerformed(ActionEvent event)
{
String text = SimpleCalc.instance.getText();
try {
currentCalc = Integer.parseInt(text);
} catch (NumberFormatException e) {
currentCalc = 0;
}
calcOperation = operator;
}
}
或者,如果您确定没有人将除数字之外的任何内容添加到SimpleCalc.instance中,则只能测试空值。
public class OperatorAction implements ActionListener
{
int calcOperation = 0;
int currentCalc;
private int operator;
// How to make
public OperatorAction(int operation)
{
operator = operation;
}
public void actionPerformed(ActionEvent event)
{
String text = SimpleCalc.instance.getText();
currentCalc = text != null ? Integer.parseInt(text) : 0;
calcOperation = operator;
}
}
还要记住,这些解决方案都不适用于良好的架构,因为它们依赖于这些数字的不可靠信息来源,但这应该可以解决您所询问的特定问题。
要获得一个好的解决方案,您需要重新设计整个解决方案,但我认为您的任务不需要。