Java getWidth不能作为类变量正常工作

Java getWidth不能作为类变量正常工作,java,class,variables,inner-classes,acm.graphics,Java,Class,Variables,Inner Classes,Acm.graphics,我对java和编程非常陌生,我试图制作一个简单的程序,在屏幕中心画一条垂直线。为此,我制作了一个变量x,它给出了屏幕中心的x坐标。我希望能够在其他私有方法中使用这个变量。但是,当我运行代码时,没有显示任何行,就好像x被设置为0一样 import acm.graphics.*; import acm.program.*; import java.awt.*; public class Target extends GraphicsProgram { int x = getWidth

我对java和编程非常陌生,我试图制作一个简单的程序,在屏幕中心画一条垂直线。为此,我制作了一个变量x,它给出了屏幕中心的x坐标。我希望能够在其他私有方法中使用这个变量。但是,当我运行代码时,没有显示任何行,就好像x被设置为0一样

import acm.graphics.*;
import acm.program.*;
import java.awt.*;

public class Target extends GraphicsProgram {   
    int x = getWidth()/2;
    public void run() {
        GLine line = new GLine (x,0,x,300);
        add (line);
    }
}
如果我像下面那样将变量x放在run方法中,那么这条线是正确绘制的,但是我以后将无法在其他私有方法中使用它,因为据我所知,该变量将不再是类变量,而是实例变量,因此只能由run访问,而不能由其他方法访问

public class Target extends GraphicsProgram {   
   public void run() {
        int x = getWidth()/2;            
        GLine line = new GLine (x,0,x,300);
        add (line);
    }
}
有人能告诉我为什么第一个代码不起作用而第二个代码起作用吗?
提前非常感谢

在第一个版本中,在实例初始化期间调用getWidth,并且可能尚未设置窗口的边界。因此,它仍然有效,但该方法返回0,您可能看不到屏幕上的线条。

我认为这与图形的生命周期有关。“宽度必须在运行实例初始值设定项后设置。@Sotirios Delimanolis感谢您的回答,但我不太明白。”。如果“生命周期”是指图形在一段时间后“过期”,请纠正我的错误,并请原谅我的外行语言,为什么不能将getWidth的当前值指定给x并完成处理?谢谢你的快速回复!正如zjor在下面回答的那样,GUI API必须先实例化类,然后才能将任何值分配给其字段。实例字段初始化表达式中的getWidth将在GUI框架能够做任何事情之前运行,即,还不能设置宽度。对了,多亏了您和@Sotirios Delimanolis,我想我现在理解了这个问题。为了解决这个问题,我首先在类中声明了x,然后在run实例中分配了getWidth/2。