A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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, 下载次数: 62)

TT截图未命名.jpg

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

7 个回复

倒序浏览
成员属性,private Frame f;没有被实例化,
你实例化的是 init()方法中的 局部变量Frame f = new Frame();
而你在 myEvent() 方法中调用的是  没有实例化的 成员属性 f

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
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();
        }
}
这么写就不抛空指针异常了

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
都彭韬 发表于 2012-12-3 09:07
成员属性,private Frame f;没有被实例化,
你实例化的是 init()方法中的 局部变量Frame f = new Frame() ...

Frame f 是全局的啊 在init()中new 后 不是也可以的吗  大神在给解释解释
回复 使用道具 举报
吴新 发表于 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:36
是可以在里面 new  但是 不能写 成Frame f = new Frame();

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

哦,明白了,哈哈谢谢啦
回复 使用道具 举报
吴新 中级黑马 2012-12-3 09:49:09
7#
大神解释的很好了 ,如果你非要那么写的话就在init()中把Frame 和button but 当政参数传到myEvent() 中也行不过没必要了
回复 使用道具 举报
明白了,谢谢啦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马