- PR -

他のファイルにあるクラスのメソッドを呼び出して描画するには?

1
投稿者投稿内容
fuzuki
常連さん
会議室デビュー日: 2003/08/23
投稿数: 48
投稿日時: 2003-09-14 18:08
こんにちは。

あるクラスから、他のファイルにあるJPanelのクラスを作成し、そのJPanelのクラスにある画像ファイルを呼び出して描画するメソッドを使用して、作成したJPanel上にそのファイルの画像を描きたいと思っているのですが、うまくいかず困っています。

具体的には、以下のような感じでやっています。

----------------Control.java
import java.awt.*;
import javax.swing.*;

public class Control extends JApplet
{
 private Draw panel1 = new Draw(); // ここでこの後に書かれているDraw.javaクラスを作成

 public void init()
 {
  Container c = getContentPane();
  c.setLayout (new FlowLayout());
  panel1.setPreferredSize(new Dimension(200, 200));
  panel1.setBackground(Color.white);
  c.add(panel1);
  // ここでDrawクラスにあるメソッドを呼び出して画像を描画させる
  panel1.drawIcon(); // ここをコメントアウトするとパネルだけは正常に表示される
 }
}
----------------Control.javaここまで

----------------Draw.java
import java.awt.*;
import javax.swing.*;

public class Draw extends JPanel
{
 private Image image;

 public void init()
 {
  Icon icon = new Icon();
 }
 public void drawIcon()
 {
  Graphics g = this.getGraphics();
  g.drawImage(image,50,50,this);
 }
 private class Icon extends JApplet // getImageを使用するためJAppletを継承
 {
  public void init()
  {
   image = getImage(getDocumentBase(),"icon.gif");
  }
 }
}
----------------Draw.javaここまで

コンパイルは通りますが、このプログラムを実行するとDrawクラス内でdrawImageを行った時点でNullPointerExceptionになってしまいます。
Control.javaの中にDraw.javaの内容を全て移動して一つのファイルにするとうまくいきます。(ある程度Draw.javaの内容を書き換えないとなりませんが)
ただ、どうしても二つのファイルに分けて、Controlから命令を送ってDrawのほうで画像ファイルを呼び出して描かせたいのです。このようなことはできますか?何か構造自体が間違っているのでしょうか?

[ メッセージ編集済み 編集者: fuzuki 編集日時 2003-09-14 18:18 ]
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2003-09-14 18:37
fuzukiさんこんにちは。

init()の中で描画処理をしようとしてるからではないでしょうか?
paintComponent() で描画したらどうでしょう。

それと、Drawの内部クラスの JAppletの拡張はできますが、
サンドボックス(コンテキスト)との関連付けされてないと
思うように動作しないのではないでしょうか?

あ、更に、Drawの init()はいつ呼び出されるのでしょうか?

[ メッセージ編集済み 編集者: Kissinger 編集日時 2003-09-14 18:40 ]

[ メッセージ編集済み 編集者: Kissinger 編集日時 2003-09-14 18:49 ]
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2003-09-14 19:14
直接、相互依存しているなどの問題はあり、あまり良い
例ではありませんが、こんな感じでわ?

Control.java
コード:
import java.awt.*;
import javax.swing.*;

public class Control extends JApplet {
  private Draw panel1;

  public void init() {
    Container c = getContentPane();
    c.setLayout (new FlowLayout());
    panel1 = new Draw(this);
    panel1.setPreferredSize(new Dimension(200, 200));
    panel1.setBackground(Color.white);
    c.add(panel1);
  }
}



Draw.java
コード:
import java.awt.*;
import javax.swing.*;

public class Draw extends JPanel {
  private Image image;

  public Draw(JApplet applet) {
    image = applet.getImage(applet.getDocumentBase(), "icon.gif");
  }

  public void paintComponent(Graphics g) {
    g.drawImage(image, 50, 50, this);
  }
}

fuzuki
常連さん
会議室デビュー日: 2003/08/23
投稿数: 48
投稿日時: 2003-09-14 22:19
Kissingerさん、早速のご返事ありがとうございました。

最初のレスの内容を考えている間に例文までアップしていただき驚きました(^^
例文のようにやったところ、うまくいきました。少し急いでいたので本当に助かりました。どうもありがとうございましたm(_ _)m
1

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