黑马程序员技术交流社区

标题: GUI简单程序(我的窗口怎么一初始化就空指针呢) [打印本页]

作者: 孙万利    时间: 2012-12-3 08:57
标题: GUI简单程序(我的窗口怎么一初始化就空指针呢)
import java.awt.*;
import java.awt.event.*;
/*
组件与监听分离
*/
class FrameDemo
{
private Frame f;
private Button but;
FrameDemo()
{
  init();
}
public void init()
{
  Frame f = new Frame();
  f.setBounds(200,300,500,300);
  f.setLayout(new FlowLayout());
  but = new Button("Button");
  f.add(but);
  myEvent();
  f.setVisible(true);
  
}
private void myEvent()
{
  f.addWindowListener (new WindowAdapter()
  {
   public void windowClosing(WindowEvent e)
   {
    System.exit(0);
   }
  });
  but.addActionListener(new ActionListener()
  {
   public void actionPerformed(ActionEvent e)
   {
    System.out.println("按钮操作");
    System.exit(0);
   }
  });
  
}

public static void main(String[] args)
{
  new FrameDemo();
}
}

TT截图未命名.jpg (19.75 KB, 下载次数: 65)

TT截图未命名.jpg

作者: 小灰灰    时间: 2012-12-3 09:07
成员属性,private Frame f;没有被实例化,
你实例化的是 init()方法中的 局部变量Frame f = new Frame();
而你在 myEvent() 方法中调用的是  没有实例化的 成员属性 f
作者: 吴新    时间: 2012-12-3 09:11
import java.awt.*;
import java.awt.event.*;

/*
组件与监听分离
*/
public class Frame{
        private Frame f;
        private Button but;

        Frame() {
                init();
        }

        public void init() {
                Frame f = new Frame();
                f.setBounds(200, 300, 500, 300);
                f.setLayout(new FlowLayout());
                but = new Button("Button");
                f.add(but);
                //myEvent();
                f.addWindowListener(new WindowAdapter() {
                        public void windowClosing(WindowEvent e) {
                                System.exit(0);
                        }
                });
                but.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                                System.out.println("按钮操作");
                                System.exit(0);
                        }
                });
                f.setVisible(true);

        }
/*
        private void myEvent() {
                f.addWindowListener(new WindowAdapter() {
                        public void windowClosing(WindowEvent e) {
                                System.exit(0);
                        }
                });
                but.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                                System.out.println("按钮操作");
                                System.exit(0);
                        }
                });

        }
*/
        public static void main(String[] args) {
                new Frame();
        }
}
这么写就不抛空指针异常了
作者: 吴新    时间: 2012-12-3 09:32
都彭韬 发表于 2012-12-3 09:07
成员属性,private Frame f;没有被实例化,
你实例化的是 init()方法中的 局部变量Frame f = new Frame() ...

Frame f 是全局的啊 在init()中new 后 不是也可以的吗  大神在给解释解释
作者: 小灰灰    时间: 2012-12-3 09:36
吴新 发表于 2012-12-3 09:32
Frame f 是全局的啊 在init()中new 后 不是也可以的吗  大神在给解释解释

是可以在里面 new  但是 不能写 成Frame f = new Frame();

而应该写成 f = new Frame();

如果 你写Frame f = new Frame(); 就是 实例化了  局部变量 f  这个 f 和你定义的 成员变量 f 是不同的


作者: 吴新    时间: 2012-12-3 09:43
都彭韬 发表于 2012-12-3 09:36
是可以在里面 new  但是 不能写 成Frame f = new Frame();

而应该写成 f = new Frame();

哦,明白了,哈哈谢谢啦
作者: 吴新    时间: 2012-12-3 09:49
大神解释的很好了 ,如果你非要那么写的话就在init()中把Frame 和button but 当政参数传到myEvent() 中也行不过没必要了
作者: 孙万利    时间: 2012-12-3 15:03
明白了,谢谢啦




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2