- - PR -
アプレットウィンドウ上での repaint( ) update( ) paint( )メソッドの動作について
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2003-10-21 21:01
『 〜忍者鳥取県ピンチの巻〜 @サブタイトル 納期早まる・・LOVE☆涙色 』
す、、すいますいません (@。・_・)(涙) 表題の件で、現在立ち往生しています、、、どなたか 助け舟をどうかお願いします。 m(_ _)mペコリンコ 詳細は以下の通りです。 【内容の概要】 アプレットウィンドウにカレンダーを表示します。 デフォルトで当日の日付が含まれる月のカレンダーが表示されます。 (●例:本日21日現在であれば10月のカレンダーを表示します。) アプレットウィンドウ上の『前月』『次月』ボタンを押下した際に 9月、又は11月のカレンダーを表示する仕様になっています。 (といいますか、、、したいのです(・_・、)ウワーン) 尚、日付の部分は日付のラベルがセットされたButtonオブジェクトと なっています。 【内容の詳細】 @アプレットのボタンを押下 Ajava.awt.Frameクラスを使ってアプレットウィンドウを表示 BFrame上にはPanelクラスを拡張したMyPanelを配置 そのPanelクラスの内容は簡単に書くと次のような感じです。 【問題点】 問題なのは、アプレットのボタンを押下して、アプレットウィンドウを 起動させます。そこで、『前月』『次月』ボタンを押下した場合 ちゃんと、前月・次月のカレンダーの画面を表示します。 しかーーし、一度アプレットウィンドウを非活性化させ、 (たとえばブラウザなどをクリック) その後、アクティブの状態にして『前月』『次月』ボタンを押しても な、、なんと!! カレンダーが前月・次月を表示しないのです。 正確に言うと、当月のカレンダーのButtonがそのままずっと、アプレットウィンドウ 上に居座ってしまいます、、、。 でも、ちゃんと『前月』『次月ボタン』を押した際にremove(Button[row][col]) で削除してるのに、、、うーん・・・・・・・マンダム。 ネットでいろんなサイトあさってみました。 repaint( ) のメソッドは update( )がない場合 paint( )メソッドを実行 ある場合は update( ) メソッドを実行。 paint( )メソッドは一番最初に図形を描画する際によばれる場合と、 非活性化した後に活性化するとときに呼ばれる場合があると、、 JAVAのコンソールでどういった流れでこれらのメソッドが実行しているのか System.out.println("paint"); System.out.println("update"); として確認しましたところ、一番最初にアプレットウィンドウがたちあがった際に どういうわけかpaint( )メソッドが実行された直後repaint( )メソッドが 呼ばれていないのに update( )メソッドが起動していました、、 その後、『前月』『次月』ボタンを押下するたびに(repaintメソッドがよばれるたび) にpaint( )、update( )メソッドの順に実行されていました、、、 なぜにー(T▽T)オロロ repaint( )メソッドで update( )メソッドだけ 起動するのでは!?・・・・・うーん、、、、、マンダム その後、アプレットウィンドウを非活性化させ、ふたたび活性化状態にし 『前月』『次月』ボタンを押すとupdate( ) メソッドしか起動してません。 この処理自体は、repaint( )メソッドで update( )が起動していると考えると おかしくないと思いますが、当月の日付ボタンが残ったままで、削除されていません。 その後、いくら『前月』『次月』ボタンをおしても、日付ボタンが正しく 表示されません。うわーん(。_。、)どなたか、理由がお分かりの方いらしましたら どうかアドバイスお願いします。 (・_・、)デモコンナニナガイノ・・・ダレモヨマナイヨネ・・・ウワーン(涙) ちなみに そのアプレットをトムキャットのサーバにのせてみました、 よろしかったらご覧ください。尚、固定IPでありませんので、IP変わってしまって みれない場合があります。 ※尚、カレンダーの日付ボタンの位置は10月度以外は正確な位置にはでていません。 http://219.112.112.152:8080/ninjya/
| ||||
|
投稿日時: 2003-10-21 23:27
なげ〜よ!
# ウソウソ つっこみどころはたくさんありますが、まず
こーゆーものはコンストラクタで構築します(別にpaint()内でやってもいいけどリソースのムダ!)。 で、本題のrepaint(), update(), paint()の挙動はデバッガでbreak pointでも張って、確認してください。 アップレットのデバッグ方法は知らないですが、Applet自体Panelのサブクラスなので、Frameに貼りつけ、Javaアプリとしてやれば、IDEとかから起動すればいいんじゃないのかな(多分アブノーマルな方法だと思うけど...)。 J2SE 1.4系では、repaint()を呼ぶと、なんやかんやあったあと、update()がよばれ、update()でなんやかんやあった後、paint()が呼ばれるのが確認できると思います。 実際の挙動は、自分で確認してね。 [ メッセージ編集済み 編集者: かずくん 編集日時 2003-10-21 23:28 ] | ||||
|
投稿日時: 2003-10-22 09:24
『 〜忍者鳥取県感涙男泣きの巻き〜 』
おはようございます。忍者鳥取県です。
いえ、まじで長いっす、、、(反省) でも、こんなに長いのにちゃんと読んでアドバイスをくれる いい人っているんですね(T▽T)オロロ(男泣き) ほんとに、ありがとうございます。m(_ _)mペコリンコ ちょっと、アドバイスで受けたコードの改善やってみます。 また、私の開発環境はEclipseなのですが、アプレットのデバッグができる プラグインがあるようなので、そちらで挙動確認してみます。 | ||||
|
投稿日時: 2003-10-22 11:14
(自己レス)
わたしバカよねー、、、おばかさんよね、、、うしろ指うしろゆーびさされても〜♪ 原因がわかりました。 このスレッドまともに読んでるひといないかもしれませんが、、 もしかした読んでるかもしれないあなたへ愛を込めて♪ paint( ) メソッド → 最初に呼ばれるもしくは画面の一部が隠されて それがまた、表に表示されたときに呼ばれる。 repaint( ) メソッド → update( )メソッドを呼ぶ な感じなんですけど、あるボタンを押したときに リペイントメソッドでupdate( )メソッドを呼び出すつもりだったのですが、 ボタンのイベント時に1回パネル上のボタンオブジェクトを削除するといった 処理を実装していました。これが、、、諸悪の原因でした。(・_・) ボタンオブジェクトを削除したときに、そのオブジェクトが削除されたことによって どうやらpaint( )メソッドが呼び出されてしまいます。 うーむ、手をぬかずにちゃんとデバッガーで確認するのがもっとも早いですね(反省) かずくんさん SpecialThanksです m(_ _)mペコリ | ||||
1
