- ベストアンサー
paint()以外でサブ関数を作りたい
- java初心者の方がpaint()以外でサブ関数を作成したいとのことです。
- しかし、うまく実行できないようで、public void paint(Graphics g)内に書くと正常に表示されるようです。
- 質問者は、public void paint(Graphics g)の中身と同じ内容の別名のサブ関数を作成しましたが、うまくいかず、エラーが出てしまいます。原因を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
> しかし、「drawLetter( aa );」と書くと、「java.lang.NullPointerException at P1.paint(P1.java:76)」というエラーが出ます。 ですから、drawLetter(g); です。drawLetter( aa );でもdrawLetter( Graphics aa );でもなく、drawLetter(g); です。先の回答にも書いたはずですが。なぜdrawLetter( aa );とかわざわざ間違った文を書いてエラーを起こすのですか。drawLetter(g);に修正して試してみてください。
その他の回答 (2)
>drawLetter( Graphics aa );の箇所でエラーが出ています。 そんな書き方はJavaにはありません。drawLtetter(g);です。インスタンスgを引数に渡して呼び出すのですから。drawLetter( Graphics aa );では文法からしておかしいでしょう。 どうも描画の仕組み云々以前の問題として、Javaの基本がよく理解できていないようですね。先へ進む前に、もう少し基礎から勉強しなおしたほうがよいと思いますよ。
実行されないわけではないと思います。実行されているが、そのあとでpaintが呼び出されるので無意味だ、というだけです。init内でdrawLetterを呼び出しても、initの処理が完了しアイドル状態に戻る段階で画面を更新するイベントによりpaintが呼び出され、それまでの表示はすべて一度消去され、改めてpaintの内容が描かれます。ですから、実行されていたとしても無意味なのです。 画面の描画は、必要が生じた時に表示の更新イベントが発生し、それによりシステムがpaintメソッドを呼び出して最終的な表示を作成します。ですから、paintメソッドをオーバーライドして描画処理を用意するのです。 どうしても処理を分離したいならば、public void drawLetter(Graphics g)というように定義し、paintメソッの最後にdrawLetter(g)というように呼び出して処理すればいいでしょう。なお、その場合にはgetGraphicsではなく引数で渡されたGraphicsを使って描画をします。
補足
chiiba_kunさん、回答有難うございます。 下のように修正しましたら、他の画像も全く表示されなくなりました。 drawLetter( Graphics aa );の箇所でエラーが出ています。 何故でしょうか。 そもそもこの「Graphics aa」がどのようなものかも(aaのオブジェクト自体がどのような機能を実行して いるのかが)良く分かってないのですが。 再度宜しくご教示お願い致します。 //=========================================================================== public class P1 extends Applet { Graphics aa = getGraphics() ; public void init() { setBackground( Color.cyan ) ; setSize( 600 , 600 ) ; // drawLetter( ) ; } public void drawLetter( Graphics bb ) { bb.setFont( new Font( "MS ゴシック" , Font.BOLD , 15 ) ) ; bb.setColor( Color.red ) ; bb.drawString( "String" , 30 , 30 ) ; } public void paint( Graphics g ) { g.setColor( Color.RED ) ; g.drawOval( 300 , 300 , 70 , 70 ) ; g.setColor( Color.RED ) ; g.fillOval( 200 , 200 , 30 , 30 ) ; drawLetter( Graphics aa ) ; } } //===========================================================================
お礼
回答有難うございます。 何とか実行することが出来ました。 ところで下の二つのプログラムで、Graphicsのインスタンスのbbに対する考え方はどのように違うのでしょうか。 両方とも実行可能プログラムです。 宜しくお願いします。 ========================================================================== public class P1 extends Applet { public void init() { setBackground( Color.cyan ) ; setSize( 600 , 600 ) ; } public void drawLetter( Graphics bb ) { bb.setFont( new Font( "MS ゴシック" , Font.BOLD , 15 ) ) ; bb.setColor( Color.red ) ; bb.drawString( "String" , 30 , 30 ) ; } public void paint( Graphics g ) { g.setColor( Color.RED ) ; g.drawOval( 300 , 300 , 70 , 70 ) ; g.setColor( Color.RED ) ; g.fillOval( 200 , 200 , 30 , 30 ) ; drawLetter( g ) ; } } ================================================================================== public class P1 extends Applet { public void init() { setBackground( Color.cyan ) ; setSize( 600 , 600 ) ; } public void drawLetter( ) { Graphics aa = getGraphics() ; aa.setFont( new Font( "MS ゴシック" , Font.BOLD , 15 ) ) ; aa.setColor( Color.red ) ; aa.drawString( "String" , 30 , 30 ) ; } public void paint( Graphics g ) { g.setColor( Color.RED ) ; g.drawOval( 300 , 300 , 70 , 70 ) ; g.setColor( Color.RED ) ; g.fillOval( 200 , 200 , 30 , 30 ) ; drawLetter( ) ; } } ============================================================================
補足
仰るとおりです。 しかし、「drawLetter( aa );」と書くと、「java.lang.NullPointerException at P1.paint(P1.java:76)」というエラーが出ます。 少なくとも、「drawLetter( Graphics aa );」ではエラーがでなかったので、走らせてみました。 宜しくお願いします。