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

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

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

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

Q&A

解決済

2回答

4095閲覧

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

nuiri1343

総合スコア54

Java

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

0グッド

0クリップ

投稿2017/04/28 07:18

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

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

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

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

java

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

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

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

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

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

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

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

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

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

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

guest

回答2

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 05:11

maiko0318

総合スコア876

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

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

nuiri1343

2017/04/29 06:15

最初の方法はダブルバッファリングですよね? これもやってみたのですが、ウィンドウのサイズ変更の際のちらつきは全く改善されませんでした。。。 後半のについてですが、 今のところ自分のプログラムではマルチスレッドは立てていないので このような書き方はしていないです。
KSwordOfHaste

2017/04/29 07:12

自分もようやくmaiko0318さんの回答意図がわかりました。ダブルバッファリングして再描画頻度を上げてももちらつきは改善できないようです。次のように動いているように見えますね ・アプレットビューアーが背景を描画 ・アプレットビューアーが背景を描画しおわった段階でOSのウィンドウへその内容を反映 ・アプレットのrepain/paintが動く ・アプレットビューアーがpaintの結果を再度OSのウィンドウへ反映
guest

0

ベストアンサー

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

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

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

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

投稿2017/04/28 07:28

KSwordOfHaste

総合スコア18394

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

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

nuiri1343

2017/04/29 04:51

なるほど。やはりupdate()は呼ばれない場合があるのですね。 updateが呼ばれない場合、paint()が呼ばれるのでしょうか? その場合、画面のクリアがなされないような気がするのですが、どうなんでしょう? 目的としては、ウィンドウのサイズを変更するときにおこる画面のちらつきをなんとかしたいのです。 ダブルバッファを用いても、ウィンドウのサイズ変更時のちらつきは全く改善されなかったもので どうなんでしょうか?
KSwordOfHaste

2017/04/29 05:02 編集

> updateが呼ばれない場合、paint()が呼ばれるのでしょうか? updateからpaintが呼ばれるイメージです。場合によって、「updateをすっとばして」paintが呼ばれると考えてください。つまり再描画の際にpaintは常に呼ばれると思っていいです。 > ウィンドウのサイズを変更するときにおこる画面のちらつきをなんとかしたい なるほど!現在のswingはデフォルトでダブルバッファリングが有効になっているので少なくともPCのスタンドアロンアプリではちらつきはほぼないです。ただ自分はアプレットを作らないので、アプレットの場合どうなのかは調べないと分かりません。ちらつきが再現するような最小限のコードを示せたら回答がつきやすいと思いますよ!
KSwordOfHaste

2017/04/29 06:16

一つコメント忘れてました。 > 画面のクリアがなされないような気がするのですが、どうなんでしょう? おっしゃるとおり、昔はupdateで背景をクリアするのがお約束だったのですが、それはある時点から特別な場合を除き不要になったのです。 JComponentの多くの部品はsetOpaque(false)がデフォルトですが「OS/swingのランタイムが背景をクリアするので前景色で描画する部分のみpaintすればいいですよ」という考え方で描画します。背景のクリアは特別な描画の仕方を期待しない限り必要ないのですね。
nuiri1343

2017/04/29 06:17

ふむ・・・ update()をすっ飛ばして、paint()が呼ばれるとき、画面のクリアというのはされないですよね? update()の中に画面のクリア操作が入っていると思うので swingでなくawtでやってるのでそのせいなのでしょうか。 通常の描画時はダブルバッファリングを手動でやることでちらつきは無くなりましたが、 ウィンドウのサイズを変更するときのちらつきは全く改善されないんです。
KSwordOfHaste

2017/04/29 06:26 編集

> 画面のクリアというのはされないですよね? いえ、勝手にされると思ってください。 > ウィンドウのサイズを変更 うーむ。swingで普通にかくとウィンドウサイズを変更してもちらつきはないのですが、やはり再現するような最小限のソースを貼った方が話が早いと思いますよ。質問は編集できます。その方が回り道せずに済みます。
KSwordOfHaste

2017/04/29 06:29

なぜコードをつけたほうがいいか捕捉します。swingの動きはダブルバッファーを指定しているかどうかsetOpaqueしてるかどうか、背景について何か特別な配慮をしているかどうか等々で振る舞いが微妙にかわります。質問側のコードが提示されていると、そういうことが全て明らかになるので話が早くなるのです。
KSwordOfHaste

2017/04/29 06:37 編集

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

2017/04/29 06:46

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

2017/04/29 06:52 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問