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

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

ただいまの
回答率

88.80%

javaのappletにて、ウィンドウのサイズを変更したときに、どうpaintメソッドが呼ばれるのか?

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,243

nuiri1343

score 54

質問したいこと

appletviewerで表示しているプログラムについて、
ウィンドウの大きさを変更したときによばれる再描画メソッドは何か教えてください。

試したこと

通常、再描画させたいときにはrepaint()を呼び出し、
repaint()は、update()を経て、paint()メソッドを呼び出しますが

appletviewerにて表示されているウィンドウのサイズを変更したときには
どうやらupdate()メソッドが呼ばれていないようなのです。

update()メソッドを以下のようにオーバーライドしてみました。

public void update(Graphics g){
 System.out.println("呼ばれた!!");
 g.clearRect(0,0,width,height) //widthとheightは自分の大きさ
 paint(g);
}

そして再度実行してみると、repaint()メソッドを呼び出した部分では標準出力に"呼ばれた!!"と書かれるのですが、
ウィンドウの大きさを変えたときには標準出力には何も出力されませんでした。

以上のことから、ウィンドウの大きさを変更したときにはupdate()メソッドや、repaint()メソッドが呼ばれないのではないかと考えました。

しかし、再描画はされています。
上記のように、updateをオーバーライドしたプログラムに、
画面の大きさを常にアップレット上に文字列で表示するという昨日を追加してみたところ、やはりウィンドウの大きさを変えれば、その数値も変わっていきました。
しかし、標準出力には何も出力されませんでした。
これはすなわち、ウィンドウの大きさを変えたときも再描画はされているが、update()メソッドは呼ばれていないことだと考えました。

そこで質問です。ウィンドウの大きさを変えたときには、repaint()メソッドではない再描画メソッドが呼ばれるのでしょうか?
また、それはどのようなメソッドなのでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

ウィンドウの大きさを変えたときには、repaint()メソッドではない再描画メソッドが呼ばれるのでしょうか? 

再描画の際に必ず呼び出されるメソッドはpaintです。お気づきのようにupdateは呼び出されないこともあります。

再描画イベント -> (update) -> paint -> paintComponent etc.

こんな感じで呼び出されるのですが、一般的にはpaintComponentをオーバーライドするのが作法です。それでは実装できない特別な場合のみpaintあるいは他のpaintXXXメソッドをオーバーライドするのがよいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/29 15:37 編集

    ・・・といっちゃいましたが、ごめんなさい。
    ちょっと自分で簡単なアプレットかいてやってみたら・・・アプレットビューアーで実行するとリサイズのときに盛大にちらつきますね。質問者さんはアプレットビューアー使ってますか?ブラウザ上で動かしてますか?後者ならどのブラウザーですか?

    キャンセル

  • 2017/04/29 15:46

    appletviewerでやっています。
    一応、最初の質問文にも書いてあります^^;

    キャンセル

  • 2017/04/29 15:51 編集

    > 最初の質問文にも
    おっしゃるとおり!大変申し訳ない。
    アプレットビューアーでの描画ですが、appletは
    isOpaqueue=true
    isDoubleBuffered=false
    がデフォルトですね。
    ただし、updateはアプレットでも呼ばれていないので、推測はこうです。
    通常のスタンドアロンアプリだとOSが背景を再描画するのでそれが高速なためちらつきがないが、アプレットビューアーだとそのあたりが遅いということではないかと思います。
    maiko0318さんのアドバイスを改めて考えてみると、「アプレットビューアーに再描画をまかせておけないから、自前でこう優先度のスレッドを用意して強制的に再描画させてしまえ!」という戦略なのだと思います。

    キャンセル

0

Graphics grf;
を作り、
public void paint(Graphics g) {
の中で
grfに対して描画し、
g.drawImage(offs,0,0,this);

で書き換えてもちらつきますか?
それなら
public void run() {
Thread.currentThread().setPriority(Thread.NORM_PRIORITY-3);
while(kicker != null) {
repaint();
try {
Thread.sleep(100);   >ここの値を書き換えてみてはいかがでしょう?
} catch(InterruptedException e) {}
}
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/29 15:15

    最初の方法はダブルバッファリングですよね?
    これもやってみたのですが、ウィンドウのサイズ変更の際のちらつきは全く改善されませんでした。。。

    後半のについてですが、
    今のところ自分のプログラムではマルチスレッドは立てていないので
    このような書き方はしていないです。

    キャンセル

  • 2017/04/29 16:12

    自分もようやくmaiko0318さんの回答意図がわかりました。ダブルバッファリングして再描画頻度を上げてももちらつきは改善できないようです。次のように動いているように見えますね

    ・アプレットビューアーが背景を描画
    ・アプレットビューアーが背景を描画しおわった段階でOSのウィンドウへその内容を反映
    ・アプレットのrepain/paintが動く
    ・アプレットビューアーがpaintの結果を再度OSのウィンドウへ反映

    キャンセル

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

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Javaに関する質問
  • javaのappletにて、ウィンドウのサイズを変更したときに、どうpaintメソッドが呼ばれるのか?