うーん、かなり奇妙に思えます。私は一種の変数を初期化しており、初期化の直後にコンストラクターで機能しますが、描画メソッドでは機能しなくなりました...
コードは次のとおりです。メソッド 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コマンドで見つけたので、今回の話の教訓は、何も作成していないように見えるかどうかということです。他の変数は、エディターの検索機能でテストすることをお勧めします...