Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

アプレット・アプリケーション・ダブルバッファリングについて

アプレットとアプリケーションの両方で動作するプログラムを書こうと思い下のサイトを参考(ほぼ丸写し)してプログラムを書いてみました。
http://www.asahi-net.or.jp/~dp8t-asm/java/tips/AppAppletHelloWorld.html

そして、作ったプログラムにダブルバッファを取り入れようと思い下のように書き直すと例外が発生してしまった・・・
ダブルバッファを参考にしたurl:http://bakuretuken.birdynet.com/sorajava/sora04.html

----------------------------------------------
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class JavaBase extends Applet{
    
    Graphics bg;
    Image backimage = null;
    
    public static void main(String[] args) {
        Frame frame = new Frame("JavaBase");
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt) {
            System.exit(0);
            }
        });
        Applet applet = new JavaBase();
        applet.init();
        frame.add(applet);
        frame.setSize(300, 400);
        frame.show();
        applet.start();
    } 
    public void init() {
        if( backimage == null )backimage = createImage( 300, 400 );
        bg = backimage.getGraphics();
    }
    public void paint(Graphics g) {
        bg.drawString( "OK", 100, 100 );
        g.drawImage( backimage, 0, 0, null );
    }
    public void update(Graphics g) {
        paint( g );
    }
}
----------------------------------------------
Exception in thread "main" java.lang.NullPointerException
        at JavaBase.init(JavaBase.java:26)
        at JavaBase.main(JavaBase.java:18)
----------------------------------------------
どなたか対処法かアプレットとアプリケーションの両方で動作するプログラムの書き方を教えてくださいor2

11

回答

80165

閲覧

11件の回答

評価

0

丸写し→エラー→即質問

この行動に、ご自分でなにか問題は感じませんか。
ふつうは自力で調査して、それでもわからないところを質問するものです。

評価

0

コピペで済むことが理解の気を削いできているんだろうと思うけど

持ってくるのはコピペでもなんでもいいから
まずそのコードを理解しようという気になることでしょうねぇ

mainメソッドの中の流れ
(特にアプレットとしてなら問題ないとするなら)
アプレットの動き・・ブラウザやビューアとかが持っているmainメソッドの流れを同等に再現し切れてないからだと思うけど

>at JavaBase.init(JavaBase.java:26)
は何処よ
NullPointerExceptionが出るとはどういうことよ
何が原因でNullPointerExceptionが出てるのよ

それくらいは考えてみないと
やっぱ
丸写し(考えてみない)→エラー→(考えてみない)即質問
よね

評価

0

>この行動に、ご自分でなにか問題は感じませんか。
>ふつうは自力で調査して、それでもわからないところを質問するものです。
自分なりに調査してみたつもりなのですが・・・なにぶん馬鹿なもので・・・

>mainメソッドの中の流れ
>(特にアプレットとしてなら問題ないとするなら)
アプレットとしては問題なく動作しました。
>アプレットの動き・・ブラウザやビューアとかが持っているmainメソッドの流れを同等に再現し切れてないからだと思うけど
再現の仕方が分かりません・・・or2
javaはまだ初心者なもので・・・

>>at JavaBase.init(JavaBase.java:26)
>は何処よ
26行目・・・

>NullPointerExceptionが出るとはどういうことよ
>何が原因でNullPointerExceptionが出てるのよ
init()の中の定義されていない変数を無理に参照しようとしていることを教えてくれている?


ここから自分が考えたことを書きます。

エラーはでないけど動作してくれないXD
init()の中身をpaint()に持ってくると例外が出ずに動作した・・・どうしてだろう?
プログラムを元に戻す。
アプリケーションで動かそうとしたらinit()が呼ばれていないからなのかな?ならmain()でinit()を呼んでみたらいいのかな?実際にやってみると・・・
 JavaBase の init() は java.applet.Applet の init() をオーバーライドできません。
 static でない メソッド createImage(int,int) を static コンテキストから参照することはできません。
エラーが2つも出てきてしまった・・・
ん〜・・・どうしたものか・・・一行ずつ調べていくか・・・プログラムは元に戻してと・・・そしてSystem.out.printで一行ずつ調べていくと
bg = backimage.getGraphics();
の行を境に希望した動作をしてくれないことが分かった・・・
getGraphicsを調べてみると現在表示可能でない場合、null を返すとのこと・・・そこで
bg = backimage.getGraphics();
の行のあとに
bg.setColor(Color.white);
bg.fillOval( 0, 0, 300, 400);
を付け足してみたら・・・
またNullPointerExceptionが帰ってきた・・・
お手上げです・・・
こうなったら質問掲示板に・・・
とりあえず怪しいところを書き込んで・・・
送信と・・・

こんな馬鹿なことをやっていましたor2

評価

0

>自分なりに調査してみたつもりなのですが・・・
それを書かないと、読み手には分からないんですよ。

>なにぶん馬鹿なもので・・・
とか「初心者なので」とかいう書き方は、逆に悪い印象を与えるのでやめたほうが良いです。

>26行目・・・
ではなく、ソースの中の行のことを言わないとだめでしょう。
ソースの26行目を、読み手に探させるつもりですか?
見ず知らずの人が手伝ってくれるのだから、なるべくその負担は減らすように考えましょう。

>getGraphicsを調べてみると現在表示可能でない場合、null を返すとのこと・・・
…ということは、bgがnullということではないですか?
それならbgは、使っちゃだめでしょう。

なお、この問題はここの過去ログでも一回か二回上がっています。

評価

0

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class JavaBase extends Applet{

    Graphics bg;
    Image backimage = null;

    public static void main(String[] args) {
        Frame frame = new Frame("JavaBase");
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt) {
            System.exit(0);
            }
        });
        Applet applet = new JavaBase();
        applet.init();
        frame.add(applet);
        frame.setSize(300, 400);
        frame.show();
        applet.start();
    }
    public void init() {
        /*
        if( backimage == null )backimage = createImage( 300, 400 );
        bg = backimage.getGraphics();
        */
    }
    public void paint(Graphics g) {
        if( backimage == null )backimage = createImage( 300, 400 );
        bg = backimage.getGraphics();
        bg.drawString( "OK", 100, 100 );
        g.drawImage( backimage, 0, 0, null );
    }
    public void update(Graphics g) {
        paint( g );
    }
}

評価

0

このサイトにはじめて来て覗いたけど、
この掲示板はひどいね。まともに回答
されてるものが殆どない。
この問題なんかは、初心者がかならずひっかかる
問題で、getGraphics()がnullを返してるだけだから
show()の位置を変えれはいいだけなのに、
誰も答えない。素人集団かもしれんが、、、
ふざけた板だ。

評価

0

まともな回答というのが、答えだと思っているなら、
君の理論は正しい。
ただ、ここはお助け掲示板ではない。

初心者が必ず引っかかる部分を、
上級者が答えだけ教えていたら、
答えにつながる道のりを自分では築けない。

評価

0

「こどもには答えじゃなくどうしてそうなるのか考えさせるようにしています」なんて親はいる。だがその親は何も考えていないという事実

評価

0

>ふざけた板だ。
うむ。君がふざけてないと考える掲示板を、君が作ることについては誰も止めないぞ。頑張れ。

評価

0

日付を見るんださんの、言うとおり

でもとりあえず他の困ってる人が見るかもしれないから
間違いを直しましときましょう。

>show()の位置を変えれはいいだけなのに、
ではなくてapplet.init();の位置ですね。
原因はフレームが未設定でGraphicsがとれないからで設定後にinit()すればい良い。

あと今ならshow()は使用すべきではないから
frame.setVisible(true);としないといけませんね。

もちろんかってに改蔵さんの方法でもOKだけど。

評価

0

う・・恥
誤>間違いを直しましときましょう。 
正>間違いを直しときましょう。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。