質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

3695閲覧

paintメソッドについて

nakamura-

総合スコア48

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/10/05 08:53

連投ですみません。

コード public class Part01 extends Frame{ /** * メインクラス */ public static void main(String args[]) { new Part01(); } /** * コンストラクタ */ public Part01(){ /**フレームの初期化*/ super("Shooting Game"); //タイトル設定 setBounds(0, 0, 500, 500); //位置、サイズ設定 setVisible(true); //表示設定 addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent evt){ System.exit(0); //終了処理 } }); /**キャンバスの生成*/ MyCanvas myCanvas = new MyCanvas(); add(myCanvas); //フレームにキャンバスを追加 //スレッドを作成 myCanvas.initThread(); } }
コード public class MyCanvas extends Canvas implements Runnable{ Image imageBuffer; Graphics graphicsBuffer; /** * コンストラクタ */ public MyCanvas(){ } /** * アップデート処理 */ @Override public void update(Graphics g){ paint(g); } /** * 描画処理 */ @Override public void paint(Graphics g){ System.out.println("3"); g.drawImage(imageBuffer, 0, 0, this); } /** * メインループ */ @Override public void run(){ System.out.println("1"); //オフスクリーンバッファ作成 imageBuffer = createImage(500, 500); graphicsBuffer = imageBuffer.getGraphics(); while(true){ System.out.println("2"); graphicsBuffer.setColor(Color.red); graphicsBuffer.fillRect(0, 0, 500, 500); repaint(); try{ Thread.sleep(500); } catch(InterruptedException e){ } } } /** * スレッド */ public void initThread(){ Thread thread = new Thread(this); thread.start(); } }

上のプログラムはフレームにキャンバスを貼り付けて、そこに四角形を描くプログラムです。
ですがこれを実行してもフレームが出てくるだけで赤い四角形は描かれませんでした。

コンソールで確認したところ1は1回表示されて2はちゃんとループしていましたが、3は1回も表示されませんでした。
paintメソッドはプログラムを実行すると自動的に1回呼び出されると認識していましたが違うのでしょうか?
ちなみにpaintメソッドにsuper.paint(g)を書いても四角形は描画されませんでした。

またプログラムを実行して現れたフレームをいじると赤い四角形が描画され、コンソールの方でも、いじったときからですが2と3がループしました。
この原因はpaintメソッドが初めに呼ばれていないからだと思いますがどうしたら呼ばれるようになるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

MyCanvasのpaintをオーバーライドしている箇所ですが、superクラスのpaintも呼んでください。
以下のようにします。

/** * 描画処理 */ @Override public void paint(Graphics g){ super.paint(g); System.out.println("3"); g.drawImage(imageBuffer, 0, 0, this); }

ちなみにupdateのオーバーライドは必要ありません。
もしupdateもオーバーライドするなら、同じようにスーパークラスのupdateも呼んでください。

投稿2016/10/06 00:11

search_search

総合スコア187

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakamura-

2016/10/06 00:39

回答ありがとうございます。 どちらも@Overrideしてsuper呼んでみました! 実行するとうまく動作するときとしないときがありました。 仕様上こういうものなんですかね?笑
search_search

2016/10/06 01:43

あ、コードをよく見てませんでした。 updateの中でpaint(g)は呼ばないでください。どうですか?
nakamura-

2016/10/06 07:39

うまく動作することができました! ありがとうございました。
guest

0

たしかrepaintを呼ぶと、updateメソッドが呼ばれたはずです。
updateメソッドにも描画処理を書いてみてください。

投稿2016/10/05 15:16

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakamura-

2016/10/05 23:50

回答ありがとうございます! 書いてみましたが変わりませんでした。 いったい何がダメなんですかね笑
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問