[英]Java: NullPointerException of a simple GUI program
嗨,我是Java新手。 我正试图实现一个简单的GUI程序,以在单击按钮时单击以更改面板的颜色。
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);
}
}
我得到输出窗口。 但是当我单击按钮时,出现以下异常。
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)
请指教。
亲切的问候。
您永远不会初始化this.frame
,因此它为null
。
在go()
,创建并初始化一个不同的变量,称为frame
:
JFrame frame = new JFrame();
您可能要删除第一个JFrame
:
frame = new JFrame();
您已经声明了2个称为frame
变量-一个是类变量,另一个是在go
。 删除go
内的声明并仅初始化go
内的类变量
public void go(){
//System.out.println("Entered Go()");
JFrame frame = new JFrame();
将以上更改为
public void go(){
//System.out.println("Entered Go()");
frame = new JFrame();
因为要在go
中创建一个称为frame
的新变量,所以永远不会初始化类变量frame
。 它仍然为null
,因此为NullPointerException
框架为空。 只需使用二传手为框架。 就像是 :
void setFrame(JFrame theFrame) {
this.frame = theFrame;
}
另外,您已两次声明帧。 从go()中删除它;
更改此行:
JFrame frame = new JFrame();
这样:
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);
}
您已将类变量定义为框架。 您正在实例化局部变量框架。 因此,如果不进行分配,很明显它将抛出NPE。 因为局部变量的范围仅驻留在特定方法中。
您只需要执行以下操作。
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);
}
让我解释一下异常的原因。
第一个public JFrame frame;
您声明第一个花括号具有全局范围。 第二个JFrame frame = new JFrame();
您初始化会为其创建一个新实例。 您在go()方法中声明的框架具有局部范围,并且不会将其初始化为全局范围。 这就是为什么global scope instance of frame is uninitialized
。 它导致NullPointerException
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.