我正在使用java和javax.swing
开发一个简单的计算器程序基本上,按下按钮时,程序应该获取该按钮的功能(数字或操作)并将其显示在textArea中。
计算器本身的整个逻辑并不重要。此外,还有一个 clear 菜单项,用于清除textArea中的所有文本。
但是,每按一次按钮,我都会收到以下错误:
线程“AWT-EventQueue-0”中的异常java.lang.NullPointerException at calculator.CalculatorGUI.actionPerformed(CalculatorGUI.java:106)`
当我按清除菜单项时,我也遇到了类似的错误,当我想要更改文本区域中的文本时,似乎java不喜欢它。
以下是我的代码:(第106行在actionPerfomed
方法中,我为方便起见标记了它)
public class CalculatorGUI implements ActionListener
{
// The calculator for actually calculating!
// private RPNCalculator calculator;
// The main frame for the GUI
private JFrame frame;
// The menubar for the GUI
private JMenuBar menuBar;
// The textbox
private JTextArea textArea;
private JScrollPane scrollArea;
// Areas for numbers and operators
private JPanel numKeysPane;
private JPanel opKeysPane;
private String input;
final String[] numbers = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" };
final String[] operations = { "+", "-", "*", "/" };
/**
* Constructor
*/
public CalculatorGUI() {
// Initialize the calculator
calculator = new RPNCalculator();
}
/**
* Initialize and display the calculator
*/
public void showCalculator() {
String buttonValue;
JButton button;
JMenu menu;
JMenuItem menuItem;
// Create the main GUI components
frame = new JFrame("RPN Calculator");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
numKeysPane = new JPanel(new GridLayout(4, 3));
opKeysPane = new JPanel(new GridLayout(2, 2));
initializeMenu();
initializeNumberPad();
initializeOps();
JTextArea textArea = new JTextArea();
textArea.setEditable(false);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
JScrollPane scrollArea = new JScrollPane(textArea);
// Create the components to go into the frame and
// stick them in a container named contents
frame.getContentPane().add(numKeysPane, BorderLayout.CENTER);
frame.getContentPane().add(scrollArea, BorderLayout.NORTH);
frame.getContentPane().add(opKeysPane, BorderLayout.LINE_END);
// Finish setting up the frame, and show it.
frame.pack();
frame.setVisible(true);
}
/*
* (non-Javadoc)
*
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
public void actionPerformed(ActionEvent e) {
String s = (String)e.getActionCommand();
// calculator.performCommand(s);
textArea.append(s + " "); // <<--- THIS IS LINE 106
}
/**
* Initialize the number pad for the calculator
*/
private void initializeNumberPad() {
JButton button;
for (int i = 0; i < numbers.length; i++) {
button = new JButton(numbers[i]);
button.addActionListener(this);
numKeysPane.add(button);
}
}
private void initializeOps(){
JButton button;
for (int i = 0; i < operations.length; i++){
button = new JButton(operations[i]);
button.addActionListener(this);
opKeysPane.add(button);
}
}
/**
* Initialize the menu for the GUI
*/
private void initializeMenu() {
JMenu menu;
JMenuItem menuItem;
JMenuItem menuItem2;
// Create a menu with one item, Quit
menu = new JMenu("Calculator");
menuItem = new JMenuItem("Quit");
// When quit is selected, destroy the application
menuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// A trace message so you can see this
// is invoked.
System.err.println("Close window");
frame.setVisible(false);
frame.dispose();
}
});
menuItem2 = new JMenuItem("Clear");
menuItem2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
textArea.setText("");
}
});
menu.add(menuItem2);
menu.add(menuItem);
// Create the menu bar
menuBar = new JMenuBar();
menuBar.add(menu);
frame.setJMenuBar(menuBar);
}
/**
* Helper method for displaying an error as a pop-up
* @param message The message to display
*/
private static void errorPopup(String message) {
JOptionPane.showMessageDialog(null, message);
}
}
任何帮助将不胜感激!谢谢!
答案 0 :(得分:10)
您永远不会初始化名为JTextArea
的{{1}}成员字段。您正在影响声明中的成员字段。试试这个:
textArea
而不是
textArea = new JTextArea();
textArea.setEditable(false);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
答案 1 :(得分:2)
您没有创建textarea对象,JTextArea textArea = new JTextArea();
只是在showCalculator()
中定义了隐藏未初始化的class属性的局部变量,因此请使用textArea = new JTextArea();
。