- PR -

アプレットでの描画ができません

投稿者投稿内容
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2005-02-07 12:35
テストしてませんが、多分 Sinecurve_16 を以下のようにすれば動くような気がします。
コード:

public class Sinecurve_16 extends Applet implements ActionListener
{
Sinecurve_16_draw sd = null;

public void paint(Graphics g)
{
g.drawLine(30,20,30,420);
g.drawLine(30,220,430,220);

g.drawString(" 2",20, 20);
g.drawString(" 1",20,120);
g.drawString(" 0",20,220);
g.drawString("-1",20,320);
g.drawString("-2",20,420);
g.drawString("Sample",380,230);

if(sd!=null) {
sd.paint(g);
}
}

Button bt;

public void init()
{
bt = new Button("出力開始");
add(bt);
bt.addActionListener(this);
}

public void actionPerformed(ActionEvent ae)
{
sd = new Sinecurve_16_draw();
}

Sinecurve_16_end se = new Sinecurve_16_end();
}



単純に説明すると Sinecurve_16_draw オブジェクトのpaint メソッドを呼び出していないからです。newでオブジェクトを作っただけでは paint メソッドは呼ばれません。

おそらく、Appletのpaintが自動的に実行されているので、paint メソッドは勝手に実行するものだと勘違いされているようですが、そんなことはありません。AppletのinitやpaintなどのメソッドはJavaが呼び出してくれるという約束事があるだけで、AppletでないSinecurve_16_drawのpaintはプログラムのどこかで呼ばなければずーと実行されません。

厳しいことを言ってしまいますが、過去に見てきた学生さんのバグが多いプログラムの典型的なパターンをしていますのでちょっと見直すことをお勧めします。
1.マジックコンスタントがやたらと多い (3.1415926535897932とか193)
2.配列のつかいまくり
3.クラス名が動詞 (Sinecurve_16_drawクラス)
4.なぞのフィールド (Sinecurve_16の中のse)
5.分かりにくい変数名 (seとかi_5_100とか)

あと、前にも書きましたが、codeタグを使ってください〜。

がんばってくださいね。

[ メッセージ編集済み 編集者: H2 編集日時 2005-02-07 12:36 ]
パテ太
ベテラン
会議室デビュー日: 2004/08/16
投稿数: 64
お住まい・勤務地: 千葉・東京
投稿日時: 2005-02-07 13:37
パテ太です。

メソッドの定義の中でクラス定義をするのは
・クラス内の他の場所からは使用されたくない場合
・クラス内の他の場所ではまったく使用しないかつ
 メソッド内に記述しても可読性を損なわない場合
 (リスナ定義などの比較的単純なクラス定義)
のどちらだと私は思います。

文法的には可能です(が、あまり使わない)という意味での
「蛇足」でした。
説明不足でかえって混乱させてしまったみたいで申し訳ありません。

ところでとりあえず気になったことをお伝えいたします。

Sinecurve_16_endは不要です。
1.AppletはWindowではないのでWindowListener
(WindowAdapter)は設定できません。
2.Applet内でSystem.exit()を呼び出してはいけません。

以上です。
S.Y
会議室デビュー日: 2004/10/08
投稿数: 8
投稿日時: 2005-02-07 14:36
H2さん、パテ太さん、いつもありがとうございます。

どうやらプログラムを記述する際の「常識」を、私は知らないようで、
かなりの努力が必要だとわかりました。
再学習します。

ところで、H2さんに修正していただいたコードに置き換え、
Sinecurve_16_endを削除してコンパイル、実行すると
出力開始ボタンを押した後、現れたAppletウィンドウを一度最小化して
その後アクティブにしないと出力開始されないようです。

これに関して調べたところ、

  public void actionPerformed(ActionEvent ae)
    {
      sd = new Sinecurve_16_draw();
      repaint();
    }

としなければならないようです。
どうやらrepaint();で明示的にpaintメソッドを呼び出す必要があったようです。

とりあえず最初の段階としての疑問が氷解致しました。
皆さん本当にありがとうございます。

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