我写了下面那个例子,并做了测试,的确不能调用,你可以试试,如果你可以的话,那我就只能一边郁闷去了 :)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();
}
}
{
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();
}
}
解决方案 »
- JAVA新手-怎么获得键盘输入???
- 请教java里如何使用C程序
- 初学者的一个问题
- jdbc 连接oracle,报Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.sql
- 这是什么问题
- 十万火急—大家帮忙看看
- linux7.1下的JBuilder6为什么不能…… 急……
- 谁有MySQL的讲义 或者简介 powerpoint 档案的(送400分)
- 关于applet的问题,请教!!
- 关于Java Web Start的问题,
- java application如何运行?
- jni问题
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.
问题可能是这个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 就可以得到了。
}
只是可以通过,但不知道原理!
除了少了个结尾的"}"
和import javax.swing.JFrame;
import javax.swing.JPanel;
之外,一切正常.
根本不存在,不能调用的问题.
把你的xxx定义成final的试试.
没想到你这么执著,还在想这个问题。那你自己有没有动手调试一下程序啊?你只要调试一下,看一下Exception的StackTrace就会知道问题在哪里了。public MyPanel()
{
super();
}非静态的inner class在构造函数里要初始化它的父对象(MyFrame),这个过程要在super之后完成。你看一下StackTrace就会发现在Mypanel的super里面就已经调用repaint方法,这时候,MyPanel的父对象没有被赋值,为空,而repaint里面要读取父对象的字段(xxx),所以会出现
NullPointerException.明白了吗?
子类的repaint()方法呢??
小弟不才!
你看一下StackTrace,它确实调了。
为什么?
把java的基本原理好好学学。
我没有试过运用Exception的StackTrace来调试,我是自学,也没多久。谢谢你的指导,我会试试的。
有什么好的方法吗?
你的程序的思路的没问题的,你只需要避免在MyPanel.super调用完成之前使用MyFrame
在repaint开头加入:
if (!flag) return;
to taolei(实在无聊) :
不知道你睡得晚,还是起的早,你是学生吗? :)