Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Exception in thread "AWT-EventQueue-0"?

Tags:

java

swing

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!

like image 514
Sadiq Avatar asked Mar 15 '11 03:03

Sadiq


People also ask

What is AWT EventQueue?

EventQueue is a platform-independent class that queues events, both from the underlying peer classes and from trusted application classes.

What is EventQueue invokeLater?

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.


2 Answers

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);
like image 149
andersoj Avatar answered Sep 22 '22 13:09

andersoj


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();.

like image 40
David Oliván Ubieto Avatar answered Sep 21 '22 13:09

David Oliván Ubieto