我正在自学如何在Swing中使用Java的图形UI,目前正在制作简单的计算器。但是,我在应用程序上实现+,-和清除按钮时遇到问题。
在介绍我的代码之前,我想指出的是,我省略了工作正常且与当前问题无关的部分。
我还想指出,我的程序有单独的软件包“ calculator.applicationlogic
”,其中包含接口NumberMath
及其实现CalculateNumber
。 NumberMath
和CalculateNumber
用于记录数字,因此它所做的只是返回当前数字,将当前数字加到当前数字,从当前数字中减去并通过设置为0清除记录的数字。
以下是实现UI的文件:
// GraphicCalculator.java
package calculator.ui;
import calculator.applicationlogic.*;
import calculator.ui.*;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
import javax.swing.JTextField;
import javax.swing.JPanel;
import javax.swing.JButton;
public class GraphicCalculator implements Runnable{
private JFrame frame;
private NumberMath num;
public GraphicCalculator(NumberMath num){
this.num = num;
};
@Override
public void run(){
... config for how windows look ...
}
// displays output and input
private void createComponents(Container container){
GridLayout layout = new GridLayout(3, 1);
container.setLayout(layout);
JTextField output = new JTextField("0");
output.setEnabled(false);
JTextField input = new JTextField();
container.add(output);
container.add(input);
container.add(createPanel(input, output));
}
// Button that has +, -, and clear (clear denoted with letter Z)
private JPanel createPanel(JTextField in, JTextField out){
JPanel panel = new JPanel(new GridLayout(1,3));
// create buttons
JButton addButton = new JButton("+");
JButton subButton = new JButton("-");
JButton clearButton = new JButton("Z");
// Action
CalculateListener listener = new CalculateListener(this.num, in, out);
addButton.addActionListener(listener);
subButton.addActionListener(listener);
clearButton.addActionListener(listener);
// add buttons to panel
panel.add(addButton);
panel.add(subButton);
panel.add(clearButton);
return panel;
}
public JFrame getFrame(){
return frame;
}
}
以下是EventListener,它对按钮执行操作:
// CalculateListener.java
package calculator.ui;
import calculator.applicationlogic.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JTextField;
import javax.swing.JButton;
public class CalculateListener implements ActionListener{
private NumberMath value;
private JTextField input;
private JTextField output;
public CalculateListener(NumberMath value, JTextField input, JTextField output){
this.value = value;
this.input = input;
this.output = output;
}
@Override
public void actionPerformed(ActionEvent ae){
if(ae.getSource().getClass().equals(JButton.class)){
String userInput = this.input.getText();
int inputValue = Integer.parseInt(userInput);
JButton buttonPressed = (JButton)ae.getSource();
// add
// ****** buttonPressed.getName() returns Null, which is causing program to crash ******//
if(buttonPressed.getName().equals("+")){
this.value.addNum(inputValue);
}
// sub
if(buttonPressed.getName().equals("-")){
this.value.subNum(inputValue);
}
// clear
if(buttonPressed.getName().equals("Z")){
this.value.clearNum();
}
this.output.setText(String.valueOf(this.value.getNum()));
this.input.setText("");
}
else{
System.err.println("No Button");
}
}
}
由于我遇到了ActionEvent无法识别按钮名称的问题,因此我引用了this post来确定其他按钮。在编译时,由于在获取ae.getSource()
的名称时出现“ null”,因此一旦在计算器中输入数字,程序就会崩溃。下面是我的程序的外观和崩溃结果:
在上面的示例中,在输入字段中输入数字2并按“ +”按钮后,程序崩溃。我想知道是否有人可以指导我说明为什么buttonPressed.getName()
上的CalculateListener.java
返回空值以及如何解决此问题。
谢谢您的帮助。
答案 0 :(得分:1)
只需更改
buttonPressed.getName().equals("+")
到
buttonPressed.getText().equals("+")
然后再做一次检查。