我写了下面那个例子,并做了测试,的确不能调用,你可以试试,如果你可以的话,那我就只能一边郁闷去了 :)public class Frame1 extends JFrame
{
    int xxx=0;
MyPanel panel=new MyPanel();
public Frame1()
{
setSize(500,400);
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
setVisible(true); Container c=this.getContentPane();
c.add(panel); }
    class MyPanel extends JPanel{
    public MyPanel()
    {
        super();
    }
    public void repaint()//将被super()通过动态链接调用
    {
        int i=xxx;//xxx 不能得到
    }
    }
public static void main(String[] args)
{
Frame1 frame=new Frame1();
}
}

解决方案 »

  1.   

    import javax.swing.*;
    import java.awt.*;
    public class Frame1 extends JFrame
    {
       public  int xxx=0;
            MyPanel panel=new MyPanel();
            public Frame1()
            {
                    setSize(500,400);
                    this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
                    setVisible(true);
                    Container c=this.getContentPane();
                    c.add(panel);        }
       
            public static void main(String[] args)
            {
                    Frame1 frame=new Frame1();
            }
    }
      class MyPanel extends JPanel{
        public MyPanel()
        {
            super();
        }
        public void repaint()//将被super()通过动态链接调用
        {
            int i=xxx;//xxx 不能得到
        }
        }
    实现上你的代码是这样的,他们没有任何关系。你不可能得到xxx的值 。如果想共享xxx的话,可以试试interface.
      

  2.   


    问题可能是这个inner class有没有实例化,
    如果这个inner class不是static的就必须用new A().new B(),
    即可以这样认为要实例化非static的inner class必须先实例化它的外部类,如果这个inner class是static就可以如同外部类一样访问。
    就像上一下例子一样。public void repaint()//将被super()通过动态链接调用
        {
            int i=new Frame1().xxx;//xxx 就可以得到了。
        }
         只是可以通过,但不知道原理!
      

  3.   

    楼主的例子,我已经试过了.
    除了少了个结尾的"}"
    和import javax.swing.JFrame;
    import javax.swing.JPanel;
    之外,一切正常.
    根本不存在,不能调用的问题.
      

  4.   

    是不是final变量的问题?
    把你的xxx定义成final的试试.
      

  5.   

    netyangsu(一般般):
    没想到你这么执著,还在想这个问题。那你自己有没有动手调试一下程序啊?你只要调试一下,看一下Exception的StackTrace就会知道问题在哪里了。public MyPanel()
        {
            super();
        }非静态的inner class在构造函数里要初始化它的父对象(MyFrame),这个过程要在super之后完成。你看一下StackTrace就会发现在Mypanel的super里面就已经调用repaint方法,这时候,MyPanel的父对象没有被赋值,为空,而repaint里面要读取父对象的字段(xxx),所以会出现
    NullPointerException.明白了吗?
      

  6.   

    再MyPanel的构造汉书中,super()只是调用的父类的构造函数,他又怎么通过动态连接调用
    子类的repaint()方法呢??
      小弟不才!
      

  7.   

    怎么调的?
    你看一下StackTrace,它确实调了。
    为什么?
    把java的基本原理好好学学。
      

  8.   

    to  taolei(实在无聊) :
    我没有试过运用Exception的StackTrace来调试,我是自学,也没多久。谢谢你的指导,我会试试的。
      

  9.   

    在Frame1中用static成员是不可能的,而如果不使用inner class又会很麻烦,
    有什么好的方法吗?
      

  10.   

    netyangsu(一般般):
    你的程序的思路的没问题的,你只需要避免在MyPanel.super调用完成之前使用MyFrame
      

  11.   

    比如:使用一个flag字段,初始为false,构造函数完成后设置为true,
    在repaint开头加入:
    if (!flag) return;
      

  12.   

    了解 多谢 结贴 另外 
    to taolei(实在无聊) :
        不知道你睡得晚,还是起的早,你是学生吗? :)