- PR -

drawImageができない

投稿者投稿内容
ゴールデン
常連さん
会議室デビュー日: 2004/08/22
投稿数: 46
投稿日時: 2004-08-24 23:43
説明のために簡単に書きました。次のようなコードを書きました。コンパイルのときに、”シンボルを解釈処理できません。drawImage”と出て、class BでのdrawImageができないのです。なぜできないのでしょうか?また、どのようにしたらできるようになるのでしょうか。教えていただきたいです。

import java.awt.*;
import java.applet.Applet;
public class A extends Applet implements Runnable{
B b;
public void init(){
b=new B();
}
public void update(Graphics g){
paint(g);
}
public void paint(Graphics g){
b.draw(g);
}
public void start(){}
public void stop(){}
public void run(){}
}
class B{
Image apple;
B(){
apple=getImage(getCodeBase,"○○.gif");
}
public void draw(Graphics g){
g.drawImage(apple,0,0,100,100,this);
}
}
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-08-25 00:29
エラーは抜き出しではなく、全部ペーストしたほうが第三者にわかりやすいですよ。
↓こんなエラーですよね?
A.java:21: シンボルを解決できません。
シンボル: 変数 getCodeBase
場所 : B の クラス
apple=getImage(getCodeBase,"○○.gif");
^
A.java:24: シンボルを解決できません。
シンボル: メソッド drawImage (java.awt.Image,int,int,int,int,B)
場所 : java.awt.Graphics の クラス
g.drawImage(apple,0,0,100,100,this);
^
エラー 2 個

drawImage というメソッドはあるんでしょうけど、引数として B クラスを渡しているので型がマッチしないという意味です。drawImage メソッドにはどんな値を渡せばよいですか?
#Bクラスは ImageObserver を実装していませんね。
ゴールデン
常連さん
会議室デビュー日: 2004/08/22
投稿数: 46
投稿日時: 2004-08-25 00:56
ありがとうございます。次のようなプログラムです。エラーメッセージは、

teruteru.java:219:シンボルを解釈処理できません。
シンボル:メソッドdrawImage(java.awt.Image,int,int,Ame)
位置:java.awt.Graphicsのクラス
      else{g.drawImage(ametubu,point_x[i],point_y[i],this);}
teruteru.java:227:シンボルを解釈処理できません。
シンボル:メソッドdrawImage(java.awt.Image,int,int,Ame)
位置:java.awt.Graphicsのクラス
      else{g.drawImage(ametubu,point_x[i],point_y[i],this);}
teruteru.java:235:シンボルを解釈処理できません。
シンボル:メソッドdrawImage(java.awt.Image,int,int,Ame)
位置:java.awt.Graphicsのクラス
      else{g.drawImage(ametubu,point_x[i],point_y[i],this);}
teruteru.java:244:シンボルを解釈処理できません。
シンボル:メソッドdrawImage(java.awt.Image,int,int,Ame)
位置:java.awt.Graphicsのクラス
      else{g.drawImage(ametubu,point_x[i],point_y[i],this);}
teruteru.java:257:シンボルを解釈処理できません。
シンボル:メソッドcreateImage(java.awt.image.MemoryImageSource);
位置:Ameのクラス
      ametubu=createImage(mis);

よろしくお願いします。

import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.geom.AffineTransform;
import java.awt.image.MemoryImageSource;

/*
<applet code="teruteru"width=200 height=220>
</applet>
*/

public class teruteru extends Applet implements ActionListener,Runnable{
Ame am;
int w=200;
int h=220;
Graphics og;
Image offs;
Image teru[];
Image back[];
Thread th1;
int x=0;
Button bt[];
soramoyou sm;
Panel p;
int tw=75;//てるてるくんのw
int th=140;//てるてるくんのh
DrawImage di;
int count=0;

public void init(){
di=new DrawImage("teruteru1.gif");
back=new Image[3];
back[0]=getImage(getCodeBase(),"kumo1.jpg");
back[1]=getImage(getCodeBase(),"kumo2.jpg");
back[2]=getImage(getCodeBase(),"kumo3.jpg");
teru=new Image[5];
for(int i=0;i<=4;i++){
teru[i]=getImage(getCodeBase(),"teruteru"+i+".gif");
}
am=new Ame();
am.make_ametubu();
am.amewotukuru0();
am.amewotukuru1();
am.amewotukuru2();
am.amewotukuru3();
offs=createImage(w,h);
sm=new soramoyou(back[0],teru[0],false,false,false);
BorderLayout bl=new BorderLayout();
setLayout(bl);
p=new Panel();
add(p,"South");
bt=new Button[3];
bt[0]=new Button("リセット");
bt[1]=new Button("晴れの日");
bt[2]=new Button("雨の日");
for(int i=0;i<3;i++){
add(bt[i]);
bt[i].addActionListener(this);
p.add(bt[i]);
}
}
public void start(){
if(th1==null){
th1=new Thread(this);
th1.start();
}
}
public void stop(){
th1=null;
}
public void run(){
Thread thisThread=Thread.currentThread();
while(thisThread==th1){
if(sm.Bo){
try{
th1.sleep(50);
}catch(InterruptedException e){}
repaint();
x++;
if(x>=400){x=0;}
count++;
}
}
}
public void update(Graphics g){
paint(g);
}
public void paint(Graphics g){
og=offs.getGraphics();
if(og!=null){
try{
back_kawaru1();
og.drawImage(sm.Back,0,0,w,h,x,0,x+w,h,this);
back_kawaru2();
if(x>=w&&x<2*w){
og.drawImage(sm.Back,0,0,w,h,-w*2+x,0,-w+x,h,this);
}
og.setColor(Color.blue);
og.fillRect(0,30,w,5);
teru_kawaru();
if(sm.yureru==false){
og.drawImage(sm.Img,62,30,tw,th,this);
if(sm.kawaru){
am.amewohuraseru(og);
}
}
else{
Graphics2D g2d=(Graphics2D)og;
di.kaitenn();
g2d.drawImage(di.image,di.xform,this);
og.setColor(Color.black);
}
g.drawImage(offs,0,0,this);
}catch(Exception e){}
finally{
og.dispose();
}
}

}
public void actionPerformed(ActionEvent e){
x=0;
if(e.getSource()==bt[0]){
sm=new soramoyou(back[0],teru[0],false,false,false);
}
else if(e.getSource()==bt[1]){
sm=new soramoyou(back[0],teru[1],true,true,false);
}
else{
sm=new soramoyou(back[1],teru[2],true,false,true);
}
}
public void back_kawaru1(){
if(sm.kawaru){
sm.bcount++;
if(sm.bcount>=0&&sm.bcount<400){sm.Back=back[1];}
else if(sm.bcount>=400&&sm.bcount<800){sm.Back=back[2];}
else if(sm.bcount>=800){
sm.bcount=800;
sm.Back=back[0];
}
}
}
public void back_kawaru2(){
if(sm.kawaru){
if(x>w&&x<=400){
if(sm.bcount>=200&&sm.bcount<400){sm.Back=back[2];}
else if(sm.bcount>=600&&sm.bcount<800){sm.Back=back[0];}
}
}
}
public void teru_kawaru(){
if(sm.kawaru){
if(sm.bcount>=300&&sm.bcount<700){sm.Img=teru[3];}
else if(sm.bcount>=700&&sm.bcount<800){sm.Img=teru[4];}
else if(sm.bcount>=800){sm.Bo=false;}
}
}
}
class Ame{
MemoryImageSource mis;
Image ametubu;
int speed;
int point_x[];
int point_y[];
int point_xx[];
int point_yy[];
int point_xxx[];
int point_yyy[];
int point_xxxx[];
int point_yyyy[];
int ame[];
Ame(){
}
public void amewotukuru0(){
point_x=new int[40];
point_y=new int[40];
for(int i;i<40;i++){
point_x[i]=(int)(Math.random()*200);
point_y[i]=(int)(Math.random()*200);//全雨粒の位置設定
}
}
public void amewotukuru1(){
point_xx=new int[30];
point_yy=new int[30];
for(int i;i<30;i++){
point_xx[i]=(int)(Math.random()*200-200);
point_yy[i]=(int)(Math.random()*200-200);//全雨粒の位置設定
}
}
public void amewotukuru2(){
point_xxx=new int[20];
point_yyy=new int[20];
for(int i;i<20;i++){
point_xxx[i]=(int)(Math.random()*200-200);
point_yyy[i]=(int)(Math.random()*200-200);//全雨粒の位置設定
}
}
public void amewotukuru3(){
point_xxxx=new int[10];
point_yyyy=new int[10];
for(int i;i<10;i++){
point_xxx[i]=(int)(Math.random()*200-200);
point_yyy[i]=(int)(Math.random()*200-200);//全雨粒の位置設定
}
}
public void amewohuraseru(Graphics g){
for(int i=0;i<40;i++){
point_y[i]=point_y[i]+2;
if(point_y[i]>400){
point_y=null;
point_x=null;
}
else{g.drawImage(ametubu,point_x[i],point_y[i],this);}
}
for(int i=0;i<30;i++){
point_yy[i]=point_yy[i]+2;
if(point_yy[i]>400){
point_yy=null;
point_xx=null;
}
else{g.drawImage(ametubu,point_xx[i],point_yy[i],this);}
}
for(int i=0;i<20;i++){
point_yyy[i]=point_yyy[i]+2;
if(point_yyy[i]>400){
point_yyy=null;
point_xxx=null;
}
else{g.drawImage(ametubu,point_xxx[i],point_yyy[i],this);}
}
for(int i=0;i<10;i++){
point_yyyy[i]=point_yyyy[i]+2;
if(point_yyyy[i]>400){
point_yyyy=null;
point_xxxx=null;
}
else{
g.drawImage(ametubu,point_xxxx[i],point_yyyy[i],this);
}
}
}
public void make_ametubu(){
int p=0;
int q=0;
int g=0;
int px[]={6,6,6,5,7,5,7,5,7,4,8,4,8,3,9,3,9,2,10,1,11,1,11,1,11,0,12,0,12,0,12,0,12,1,11,2,3,9,10,4,5,6,7,8};
int py[]={0,1,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,19,19,20,20,20,20,20};
int ame[]=new int[13*21];
mis=new MemoryImageSource(13,21,ame,0,13);
mis.setAnimated(true);
ametubu=createImage(mis);
for(int i=0;i<py.length;i++){
for(int j=0;j<px.length;j++){
ame[py[i]*13+px[j]]=0xffffffff;//白
}
}
int ppx[]={6,6,6,5,7,5,7,4,8,4,8,3,9,2,10,2,10,2,10,1,11,1,11,1,11,1,11,2,3,9,10,4,5,6,7,8};
int ppy[]={3,4,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,18,18,19,19,19,19,19};
for(int i=0;i<ppy.length;i++){
for(int j=0;j<ppx.length;j++){
p=((int)((0xffffffff>>24)/2)<<24)|0x00ffffff;//透明度を増す(2/1)
ame[ppy[i]*13+ppx[j]]=p;
}
}
for(int i=0;i<20;i++){
for(int j=0;j<12;j++){
if(ame[i*13+j]!=0xffffffff&&ame[i*13+j]!=p&&(ame[(i*13+j)+1]==p|ame[(i*13+j)-1]==p)&&(ame[(i*13+j)+13]==p|ame[(i*13+j)-13]==p)){
q=((int)((p>>24)/2)<<24)|0x00ffffff;//透明度を増す(4/1)
ame[i*13+j]=q;
}
else if(ame[i*13+j]!=0xffffffff&&ame[i*13+j]!=p&&ame[i*13+j]!=q&&(ame[(i*13+j)+1]==q|ame[(i*13+j)-1]==q)&&(ame[(i*13+j)+13]==q|ame[(i*13+j)-13]==q)){
g=((int)((p>>24)/2)<<24)|0x00ffffff;//透明度を増す(8/1)
ame[i*13+j]=g;
}
else if(ame[i*13+j]!=0xffffffff&&ame[i*13+j]!=p&&ame[i*13+j]!=q&&ame[i*13+j]!=g){ame[i*13+j]=0x00ffffff;}//その他は透明
}
}
mis.newPixels();
}
}
class soramoyou{
Image Back;
Image Img;
boolean Bo;
int bcount;
boolean yureru;
boolean kawaru;
soramoyou(Image back,Image img,boolean bo,boolean Yureru,boolean Kawaru){
Back=back;
Img=img;
Bo=bo;
bcount=0;
yureru=Yureru;
kawaru=Kawaru;
}
}
class DrawImage extends Component{
AffineTransform xform;
Image image;
double r;
double theta;
int i;
public DrawImage(String fileName){
Toolkit toolkit=Toolkit.getDefaultToolkit();
image=toolkit.getImage(fileName);
r=0.0;
i=0;
xform=new AffineTransform();
}
public void kaitenn(){
i=i+20;
if(i>=360){i=0;}
r=Math.cos(Math.toRadians(i));
theta=Math.toRadians(r);
xform.rotate(theta,110,30);
}
}
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-08-25 06:51
ゴールデンさん、こんにちは。

java.awt.Graphicsの drawImageには、Ameクラスを引数にとる
メソッドはありませんよ。

Ameは単なる java.lang.Objectのサブクラスですから。

java.awt.image.ImageObserverを実装したクラス(たとえば、
java.awt.Componentまたはそのサブクラス)でなければなり
ません。

山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-08-25 09:22
どこかのサンプルコードを見て書いたら動いたけども、自分で書き換えているうちにコンパイルが通らなくなった、といったところでしょうか?

ひとまずマネをして動かしてみるのは大事ですけど全く理解をせずに改造をしていくと痛い目に遭います。
APIや Java の基本的な参考書を頼りに少しずつ理解していく段階ではないでしょうか。
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Graphics.html#drawImage(java.awt.Image,%20int,%20int,%20int,%20int,%20java.awt.image.ImageObserver)
AWTやSwing はデザインパターンが多く適用されていて初心者にはその動きを理解するのはちょっと難しいところですが、ひとまずコンパイラのメッセージの意味を理解するところから始めると良いと思います。
ゴールデン
常連さん
会議室デビュー日: 2004/08/22
投稿数: 46
投稿日時: 2004-08-25 19:59
返答ありがとうございます。
teruteru.java:219:シンボルを解釈処理できません。
シンボル:メソッドdrawImage(java.awt.Image,int,int,Ame)
位置:java.awt.Graphicsのクラス
      else{g.drawImage(ametubu,point_x[i],point_y[i],this);}
については、Ameクラス内で、teruteru teru=new teruteru()を行い、thisのところを
else{g.drawImage(ametubu,point_x[i],point_y[i],teru);}

 のように変えたらコンパイルできました。
あとは、
teruteru.java:257:シンボルを解釈処理できません。
シンボル:メソッドcreateImage(java.awt.image.MemoryImageSource);
位置:Ameのクラス
      ametubu=createImage(mis);
です。なぜこれができないのかが分かりません。どのようにしたらよいでしょうか?
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-08-25 20:48
Ameクラスに
createImage(java.awt.image.MemoryImageSource)という
メソッドが無いからコンパイルでエラーが出てるのです。

でも、コンパイル通ったとしても動作するとは限りませんよ。
グラフィックコンテキストの使い方間違ってるし、
スクリーンリソースの階層にない DrawImageクラスで
イメージ操作しようとしてるし…。

このお天気予報アプレットのアイデアは楽しそうなので
夏休みの宿題のお手伝いをしたいのですが、ちょっと Goalが
遠すぎます。
ゴールデン
常連さん
会議室デビュー日: 2004/08/22
投稿数: 46
投稿日時: 2004-08-25 22:45
よくよく見たらおかしい箇所がたくさん見つかりました。それを少しずつ直しているところですが、まずその一つ…
書いたプログラムと少し変えたいのですが、
0x0fffffffのAlfaを表す0fを6段階にして透明度をつけていくようにしたいです。透明感のある雨粒を作りたいのです。
int v=(int)(0x0fffffff>>>24)/6 ///ここがおかしいのはわかりますが、
1段階 0x0fffffff
2段階 (v*5<<24)|0x00ffffff
3段階 (v*4<<24)|0x00ffffff
4段階 (v*3<<24)|0x00ffffff
5段階 (v*2<<24)|0x00ffffff
6段階 (v<<24)|0x00ffffff
vを、どのように書いたらよいでしょうか。教えていただきたいです。

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