0

うーん、かなり奇妙に思えます。私は一種の変数を初期化しており、初期化の直後にコンストラクターで機能しますが、描画メソッドでは機能しなくなりました...

コードは次のとおりです。メソッド draw() でオブジェクト位置のメソッドを呼び出そうとすると、例外が発生します。

public class GlText extends GraphicObject {

String fullText = "";

public GlText(Bounds bounds) {
    this.bounds = bounds;
    this.position = getPosition();
    System.out.println("BLOGAS: " + position.getX());
}

@Override
public void draw(Graphics g, AlignStrategy align) {
    g.setColor(Color.orange);
    g.setFont(new Font("Arial", Font.BOLD, 36));

    FontMetrics metrics = g.getFontMetrics();
    int textHeight = metrics.getHeight();
    int textWidth = metrics.stringWidth(fullText);

    // drawing position is recalculated according to text size, etc...
    int x = 0;
    int y = 0;

    // calculating x according to text width



    // !!!!!!!!!!!!!!! the Null pointer exception happens in the next line:
    System.out.println("POSITION " + position.getX());**
    System.out.println("TEXTWIDTH " + textWidth);
    System.out.println("BOUNDS " + bounds.getX());
    if (position.getX() - textWidth < bounds.getX())
        x = bounds.getX();
    else
        x = position.getX() - textWidth;

    // calculating y according to text height
    if (position.getY() - textHeight < bounds.getY())
        y = bounds.getY();
    else
        y = position.getY() - textHeight;


    Bounds drawPos = new Bounds(x, y, textWidth, textHeight);       

    // ADDED ALIGN STRATEGY
    Bounds alignedPosition = (Bounds) align.getAligned(drawPos, bounds);

    g.drawString(fullText, alignedPosition.getX(), alignedPosition.getY());


}

public final Bounds getPosition() {

        int x = 0;
        int y = 0;
        Random random = new Random();
        random.setSeed(System.nanoTime());

        x = bounds.getX() + random.nextInt(bounds.getWidth());
        y = bounds.getY() + random.nextInt(bounds.getHeight());

        Bounds newPosition = new Bounds(x, y, 0, 0);
        return newPosition;


}

例外は次のようになります。

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at GraphicObjectPkg.GlText.draw(GlText.java:43)

そして、これがGlTextで拡張している抽象クラスです:

public abstract class GraphicObject {
    protected Bounds bounds = new Bounds();
    protected Bounds position = null;

    public abstract void draw(Graphics g, AlignStrategy align);
}

OK、これはコンストラクターが呼び出される場所です。うーん、外部から呼び出されますが、コンストラクターは「BLOGAS: 180」という行を出力します。

GlText myText = new GlText(currentBounds);
        myText.setFullText("gerai");
        mainGroup.addChild(myText);

最終編集: 助けてくれてありがとう、あなたの助けのおかげで、私は最終的に問題を特定し、それはこの残り物でした:

public void setFullText(String fullText) {
    this.fullText = fullText;
    position = null;
}

クラスを改造していて、このメソッドにそんなものがあることをすっかり忘れていた… これはfindコマンドで見つけたので、今回の話の教訓は、何も作成していないように見えるかどうかということです。他の変数は、エディターの検索機能でテストすることをお勧めします...

4

1 に答える 1

1

draw がコールバック イベントで、フレームワークが構築されたオブジェクトを使用しない場合は、NullPointerException.

==draw メソッドを呼び出すときに、フレームワークが渡されたオブジェクトを使用することを確認する必要があります。メソッド内の演算子を使用して簡単に実行できますdraw

のオブジェクトへの参照をコンストラクターに格納します。GlText

private final GlText customized = null;
//Inside Constructor 
 customized = this;

インサイドdraw

 if(this != customized )
 {
    System.out.println("Objects are different");
 }

ハードウェイは、フレームワークを理解し、drawメソッドがどのように呼び出されるかを確認することです:-)

于 2012-09-30T12:06:25.233 に答える