- PR -

アプレットウィンドウ上での repaint( ) update( ) paint( )メソッドの動作について

1
投稿者投稿内容
忍者鳥取県
ベテラン
会議室デビュー日: 2003/08/28
投稿数: 61
お住まい・勤務地: リオネジャネイロの地下6000Km
投稿日時: 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/

コード:
class MyPanel extends Panel {

 //グローバル変数を使いボタン型の配列を作成
 Button button[][] = new Button[6][7];
 int day;//日付
 Strin s;//年・月を表示(2003.10)

 //コンストラクタ
 public MyPanel( 引数 , day , s, 引数) {
  this.変数 = 引数;
 this.day = day;
  this.s = s;
 }

 public void update(Graphics g){
  ほぼ下記paint(Graphics g)と同じ内容
 }

 public void paint(Graphics g) {
  
  //Graphicsクラスのメソッドを使ってカレンダーの部分枠線を描いたり
 //年・月のラベル(2003.10)と曜日のを書込みます
  g.drawLine( 〜 );
  g.drawString( s , x , y );

  //月選択ボタン
  Button bp = new Button("前月"); 
  Button bn = new Button("次月");

  //月選択ボタン表示&処理の実装
  bp.setBounds(new Rectangle(w/4-25, lh/2-15, 50, 30));
  add(bp);
  p.addActionListener( new  ActionListener() {
   public void actionPerformed(ActionEvent ae){
    //前月ボタンを押下すると前月のカレンダーの内容を表示するように色々と実装
    s   = ○×□; //年・月(前月)
  day = ○×□; //日付
     ・・・・・・・・・・・・
    //登録したボタンオブジェクトの削除
    for(int row = 0; row < 6; row++) { 
     for(int col = 0; col < 7; col++) {
      remove(button[row][col]);
      }
     }
    repaint();
   }
  });

     ・・・・・・・ 
  for(int row=0;row<6;row++){
   for(int col=0;col<7;col++){
     button[row][col] = new Button();
     button[row][col].setBounds(new Rectangle(a,b,c,d));
     //ボタンラベルに変数dayの設定
     button[row][col].setLabel(new Integer(day).toString());
     day++;
   }
  }
 }
}




かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-10-21 23:27
なげ〜よ!
# ウソウソ

つっこみどころはたくさんありますが、まず
コード:

//月選択ボタン
Button bp = new Button("前月");
Button bn = new Button("次月");

//月選択ボタン表示&処理の実装
bp.setBounds(new Rectangle(w/4-25, lh/2-15, 50, 30));
add(bp);
p.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent ae){
//前月ボタンを押下すると前月のカレンダーの内容を表示するように色々と実装
s = ○×□; //年・月(前月)
  day = ○×□; //日付
  ・・・・・・・・・・・・
//登録したボタンオブジェクトの削除
for(int row = 0; row < 6; row++) {
for(int col = 0; col < 7; col++) {
remove(button[row][col]);
}
}
repaint();
}
});

    ・・・・・・・ 
for(int row=0;row<6;row++){
for(int col=0;col<7;col++){
button[row][col] = new Button();
button[row][col].setBounds(new Rectangle(a,b,c,d));
//ボタンラベルに変数dayの設定
button[row][col].setLabel(new Integer(day).toString());
day++;
}
}


こーゆーものはコンストラクタで構築します(別にpaint()内でやってもいいけどリソースのムダ!)。

で、本題のrepaint(), update(), paint()の挙動はデバッガでbreak pointでも張って、確認してください。
アップレットのデバッグ方法は知らないですが、Applet自体Panelのサブクラスなので、Frameに貼りつけ、Javaアプリとしてやれば、IDEとかから起動すればいいんじゃないのかな(多分アブノーマルな方法だと思うけど...)。

J2SE 1.4系では、repaint()を呼ぶと、なんやかんやあったあと、update()がよばれ、update()でなんやかんやあった後、paint()が呼ばれるのが確認できると思います。
実際の挙動は、自分で確認してね。

[ メッセージ編集済み 編集者: かずくん 編集日時 2003-10-21 23:28 ]
忍者鳥取県
ベテラン
会議室デビュー日: 2003/08/28
投稿数: 61
お住まい・勤務地: リオネジャネイロの地下6000Km
投稿日時: 2003-10-22 09:24
『 〜忍者鳥取県感涙男泣きの巻き〜 』

おはようございます。忍者鳥取県です。
引用:

かずくんさんの書き込み (2003-10-21 23:27) より:
なげ〜よ!
# ウソウソ


いえ、まじで長いっす、、、(反省)
でも、こんなに長いのにちゃんと読んでアドバイスをくれる
いい人っているんですね(T▽T)オロロ(男泣き)
ほんとに、ありがとうございます。m(_ _)mペコリンコ
ちょっと、アドバイスで受けたコードの改善やってみます。
また、私の開発環境はEclipseなのですが、アプレットのデバッグができる
プラグインがあるようなので、そちらで挙動確認してみます。
忍者鳥取県
ベテラン
会議室デビュー日: 2003/08/28
投稿数: 61
お住まい・勤務地: リオネジャネイロの地下6000Km
投稿日時: 2003-10-22 11:14
(自己レス)
わたしバカよねー、、、おばかさんよね、、、うしろ指うしろゆーびさされても〜♪

原因がわかりました。
このスレッドまともに読んでるひといないかもしれませんが、、
もしかした読んでるかもしれないあなたへ愛を込めて♪

paint( ) メソッド → 最初に呼ばれるもしくは画面の一部が隠されて
            それがまた、表に表示されたときに呼ばれる。
repaint( ) メソッド → update( )メソッドを呼ぶ

な感じなんですけど、あるボタンを押したときに
リペイントメソッドでupdate( )メソッドを呼び出すつもりだったのですが、
ボタンのイベント時に1回パネル上のボタンオブジェクトを削除するといった
処理を実装していました。これが、、、諸悪の原因でした。(・_・)
ボタンオブジェクトを削除したときに、そのオブジェクトが削除されたことによって
どうやらpaint( )メソッドが呼び出されてしまいます。

うーむ、手をぬかずにちゃんとデバッガーで確認するのがもっとも早いですね(反省)
かずくんさん SpecialThanksです m(_ _)mペコリ
1

スキルアップ/キャリアアップ(JOB@IT)