简体   繁体   中英

Java: NullPointerException of a simple GUI program

Hi I am novice Java learner. I was tring to implement a simple GUI program to change the color of a panel on clicking clicking of a button.

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Button_lable implements ActionListener {
public JFrame frame;
//JPanel panel;
//JLabel label;

public static void main(String[] args) {

    Button_lable gui = new Button_lable();
    gui.go();
}//end of main
public void go(){
    //System.out.println("Entered Go()");
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JButton b_frame = new JButton("Click to change the color");
    b_frame.addActionListener(this);
    MyDrawpanel d_panel = new MyDrawpanel();

    frame.getContentPane().add(BorderLayout.SOUTH,b_frame);
    frame.getContentPane().add(BorderLayout.CENTER ,d_panel);

    frame.setSize(300, 300);
    frame.setVisible(true);


}//end of go
public void actionPerformed(ActionEvent e) {
    frame.repaint();
}


}//end of Button_lable


class MyDrawpanel extends JPanel {
    public void paintComponent(Graphics g){
Graphics2D grph = (Graphics2D) g;
int red = (int)(Math.random()* 255);
int green = (int)(Math.random()* 255);
int blue = (int)(Math.random()* 255);
Color strt_clr = new Color(red,green,blue);

red = (int)(Math.random()* 255);
green = (int)(Math.random()* 255);
blue = (int)(Math.random()* 255);
Color end_clr = new Color(red,green,blue);

GradientPaint gradient = new GradientPaint(70,70,strt_clr,150,150,end_clr);  
grph.setPaint(gradient);
grph.fillOval(50,25, 150, 150);
  }
}

I get output window. But when i click on the button, i get the following exception.

 Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Button_lable.actionPerformed(Button_lable.java:34)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Please advice.

Kind Regards.

You never initialize this.frame , so it is null .

In go() , you create and initialize a different variable called frame :

JFrame frame = new JFrame();

You might want to remove the first JFrame :

frame = new JFrame();

You have declared 2 variables called frame - one class variable and one inside go . Remove the declaration inside go & just initialize the class variable inside go

public void go(){
    //System.out.println("Entered Go()");
    JFrame frame = new JFrame();

Change the above to

public void go(){
    //System.out.println("Entered Go()");
    frame = new JFrame();

Because you are creating a new variable called frame in go , the class variable frame never gets initialized. It remains null and hence the NullPointerException

frame is null. Just use a setter for frame. Something like :

void setFrame(JFrame theFrame) {
    this.frame = theFrame;
}

Also you have declared frame twice. Remove it from go();

Change this line:

JFrame frame = new JFrame();

by this:

frame = new JFrame();
public class Button_lable implements ActionListener {
public JFrame frame; // This is a class/global variable
//JPanel panel;
//JLabel label;

public static void main(String[] args) {

    Button_lable gui = new Button_lable();
    gui.go();
}//end of main
public void go(){
    //System.out.println("Entered Go()");
    JFrame frame = new JFrame();  // This is local variable.
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JButton b_frame = new JButton("Click to change the color");
    b_frame.addActionListener(this);
    MyDrawpanel d_panel = new MyDrawpanel();

    frame.getContentPane().add(BorderLayout.SOUTH,b_frame);
    frame.getContentPane().add(BorderLayout.CENTER ,d_panel);

    frame.setSize(300, 300);
    frame.setVisible(true);


}

You have defined class variable as frame. You are instantiating local variable frame. So without assigning it is very obvious that it will throw NPE. Because the scope of local variable resides in particular method only.

You just need to do following.

public class Button_lable implements ActionListener {
public JFrame frame;
//JPanel panel;
//JLabel label;

public static void main(String[] args) {

    Button_lable gui = new Button_lable();
    gui.go();
}//end of main
public void go(){
    //System.out.println("Entered Go()");
    frame = new JFrame(); // here, the class variable is instantiated. So it wont give NPE.
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JButton b_frame = new JButton("Click to change the color");
    b_frame.addActionListener(this);
    MyDrawpanel d_panel = new MyDrawpanel();

    frame.getContentPane().add(BorderLayout.SOUTH,b_frame);
    frame.getContentPane().add(BorderLayout.CENTER ,d_panel);

    frame.setSize(300, 300);
    frame.setVisible(true);


}

Let me explain the reason of Exception.

the first public JFrame frame; you declare under first braces has global scope. And the second JFrame frame = new JFrame(); you initialize creates a new instance of it. the frame you declare in go() method has local scope and it initialize it not the global one. That's why global scope instance of frame is uninitialized . it is causing NullPointerException .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM