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.