Java:简单GUI程序的NullPointerException

时间:2013-03-31 07:14:04

标签: java

您好我是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)

请建议。

亲切的问候。

6 个答案:

答案 0 :(得分:2)

您永远不会初始化this.frame,因此它是null

go()中,您创建并初始化名为frame的另一个变量:

JFrame frame = new JFrame();

您可能想要删除第一个JFrame

frame = new JFrame();

答案 1 :(得分:0)

您已声明了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();

因为您要在frame中创建名为go的新变量,所以类变量frame永远不会被初始化。它仍为null,因此为NullPointerException

答案 2 :(得分:0)

frame为null。只需使用一个setter for frame。类似的东西:

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

你也宣告了两次框架。从go();

中删除它

答案 3 :(得分:0)

更改此行:

JFrame frame = new JFrame();

由此:

frame = new JFrame();

答案 4 :(得分:0)

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


}

答案 5 :(得分:0)

让我解释一下例外的原因。

您在第一个大括号下声明的第一个public JFrame frame;具有全局范围。初始化的第二个JFrame frame = new JFrame();会创建一个新的实例。你在go()方法中声明的框架具有局部范围,并且它初始化它而不是全局范围。这就是global scope instance of frame is uninitialized的原因。 导致NullPointerException