在Java中"this"可不可以做为事件源。如:this.addWindowListener(new WinC());
在编译时出现:KeysEvent.java:22: 无法从静态上下文中引用非静态 变量 this
                this.addWindowListener(new WinC());
这是怎么回事?

解决方案 »

  1.   

    this可以的,经常这样:
    public class MyBtn extends JButton implements ActionListener {
      public MyBtn() {
        this.addActionListener(this);
      }  @Override
      public void actionPerformed(ActionEvent e) {
      }
    }// 上述代码没进IDE看,打错字勿怪。
      

  2.   


    import java.awt.*;
    import java.awt.event.*;public class Painting extends Frame
    {
    public Painting()
    {
    super("Painting");
    setSize(200,150);
    setVisible(true);
    this.addWindowListener(new WinClos());
    } public static void main(String args[])
    {
    Painting app=new Painting();
    } public void paint(Graphics g)
    {
    g.setColor(Color.red);
    g.drawLine(50,50,150,50);
    g.drawRect(50,70,100,50);
    Font fnt=new Font("dialog",Font.ITALIC+Font.BOLD,15);
    g.setFont(fnt);
    g.drawString("Painting",70,100);
    } static class WinClos extends WindowAdapter
    {
    public void closing(WindowEvent e)
    {
    System.exit(0);
    }
    }
    }
      

  3.   

    this表示当前实体的自身对象
    静态方法不能调用实例化的对象成员
    也就是说有static就没有this
      

  4.   

    直接调用 当前公共类.class
      

  5.   

    import java.awt.*;
    import java.awt.event.*;public class Painting extends Frame
    {
    public Painting()
    {
    super("Painting");
    setSize(200,150);
    setVisible(true);
    this.addWindowListener(new WinClos());
    } public static void main(String args[])
    {
    Painting app=new Painting();
    } public void paint(Graphics g)
    {
    g.setColor(Color.red);
    g.drawLine(50,50,150,50);
    g.drawRect(50,70,100,50);
    Font fnt=new Font("dialog",Font.ITALIC+Font.BOLD,15);
    g.setFont(fnt);
    g.drawString("Painting",70,100);
    } static class WinClos extends WindowAdapter
    {
    public void closing(WindowEvent e)
    {
    System.exit(0);
    }
    }
    }也就是说我静态的main()方法引用了非静态的this?
      

  6.   

    把下句:
    static class WinClos extends WindowAdapter改成:
    class WinClos extends WindowAdapter就可以了
      

  7.   


    这怎么能行呢?你这样改了之后,那this.addWindowListener(new WinClos())
    不成了静态的main()方法来引用非静态的WinClos类了。
      

  8.   

    main方法是静态的不错。
    但是你可以在方法中new 一个实例,实例对象是可以调用实例方法的。
    跟main是不是静态没关系。
    去掉static class WinClos extends WindowAdapter里面的static应该就没问题了。
      

  9.   

    我把您在六楼贴出来的代码在我机器上编译了一下,没有提示您说的错误。而且界面可以运行。
    只是当关闭按钮的时候,不起作用。如果要让关闭按钮起作用,应该这样写:
    import java.awt.*;
    import java.awt.event.*;public class Painting extends Frame {
    public Painting() {
    super("Painting");
    setSize(200, 150);
    setVisible(true);
    //this.addWindowListener(new WinClos());
    } public static void main(String args[]) {
    Painting app = new Painting();
    app.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }
    });
    } public void paint(Graphics g) {
    g.setColor(Color.red);
    g.drawLine(50, 50, 150, 50);
    g.drawRect(50, 70, 100, 50);
    Font fnt = new Font("dialog", Font.ITALIC + Font.BOLD, 15);
    g.setFont(fnt);
    g.drawString("Painting", 70, 100);
    } /*static class WinClos extends WindowAdapter {
    public void closing(WindowEvent e) {
    System.exit(0);
    }
    }*/
    }以上代码是可以运行的。请楼主看看吧。有什么事情,可以给我留言,希望我们多多交流,大家才可以共同提高,对吧?!