I'm working on a simple calculator program using java and javax.swing
Basically, when you press a button, the program is supposed to fetch the function of that button (number or operation) and display it in the textArea.
The whole logic for the calculator itself doesn't matter. Also, there's a clear menu item that clears all the text in textArea.
However, every time a press a button, I get the following error:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at calculator.CalculatorGUI.actionPerformed(CalculatorGUI.java:106)`
I'm also getting a similar error when I press the clear menu item, it seems like java doesn't like it when I want to change the text in the text area.
Here's my code: (Line 106 is in the actionPerfomed
method, I've labeld it for your convenience)
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);
}
}
Any help would be greatly appreciated! Thanks!
EventQueue is a platform-independent class that queues events, both from the underlying peer classes and from trusted application classes.
invokeLater. public static void invokeLater(Runnable runnable) Causes runnable to have its run method called in the dispatch thread of the system EventQueue . This will happen after all pending events are processed.
You don't ever initialize the JTextArea
member field called textArea
. You are shadowing the member field in your declaration. Try this:
textArea = new JTextArea();
textArea.setEditable(false);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
instead of
JTextArea textArea = new JTextArea();
textArea.setEditable(false);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
You are not creating the textarea object, JTextArea textArea = new JTextArea();
just defines a local variable in the showCalculator()
that hides the class attribute that remains uninitialized, so use textArea = new JTextArea();
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With