- PR -

paint メソッドが呼び出せません

投稿者投稿内容
アジサン
会議室デビュー日: 2007/01/20
投稿数: 3
投稿日時: 2007-01-20 08:51
はじめまして
stars.txtに書かれている星のデータを読み込んで
星を描くプログラムを作成しましたが、コンパイル
すると下記のエラーが出てしまいます。どこが悪い
のか教えてください。よろしくお願い致します

エラー内容
シンボルを解決できません
シンボル:変数g
場所  :Starのクラス
    this.paint(g):


import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

/*ファイルに書かれている星のデータを900×600の画面に表示するクラス*/
class Star
{
double k,l,m,r;
int kk,ll;
double width=900;
double height=600;
Star(double a,double b,double c,double f){
k=a;
l=90-(b);
m=c;
r=f;
}

/*ファイルに書かれている星のデータを900×600の画面に表示するために座標変換を行うメソッド*/
void show(){
k=(k/360)*width;
kk=(int)k;
l=(l/180)*height;
ll=(int)l;
System.out.println( kk+" "+ll+" "+" "+r);

/*星のデータを描くメソッドの呼び出し*/
this.paint(g);
}


/*星のデータを描くメソッド*/
public void paint(Graphics g){
g.fillRect(kk,ll,1,1);
}
}

/*星のデータをstars.txtから読み込み表示するプログラム*/
class showstars extends JFrame
{
public static void main(String[] args)
{
Vector Stars=new Vector();
int s=0;
double a,b,c,f;
a=0;
b=0;
c=0;
f=0;
try{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str;
System.out.println("球の半径");
str=br.readLine();
f=Integer.parseInt(str);
FileReader fr=new FileReader("stars.txt");
StreamTokenizer st=new StreamTokenizer(fr);
st.whitespaceChars(',',',');
while(st.nextToken()!=StreamTokenizer.TT_EOF)
{
s++;
if(s==1){
a=st.nval;
}
else if(s==2){
b=st.nval;
}
else if(s==3){
c=st.nval;
}

else{
s=1;
Stars.addElement(new Star(a,b,c,f));
a=st.nval;
}


}

fr.close();
}catch(Exception e){
System.out.println("Exception: "+e);
}
for(int i=0;i<Stars.size(); i++)
{
((Star)Stars.elementAt(i)).show();


}
}

}
/*
stars.txtの内容
19.449947, 3.614472,5.20
17.092956, 5.650358,5.50
28.388828, 3.187367,4.60
22.545292, 6.144056,4.80
25.357964, 5.487578,4.40
30.798161, 0.128342,5.40
35.486036, 0.395739,5.30
30.511703, 2.763703,3.90
37.875286, 2.267239,5.30
39.870578, 0.328500,4.10
40.825578, 3.236144,3.40
38.968578, 5.593342,5.00
45.569953, 4.090058,2.50
49.839500, 3.369972,4.80
54.218883, 0.402975,4.30
56.418036, 6.050150,5.30
67.133703, 1.380883,5.50
61.040689, 2.827267,5.40
60.935847, 5.435472,5.30
*/
nekoyama
ベテラン
会議室デビュー日: 2005/03/12
投稿数: 71
投稿日時: 2007-01-20 09:20
引用:

エラー内容
シンボルを解決できません
シンボル:変数g
場所  :Starのクラス
    this.paint(g):



変数gって、どこにあるんですか?という意味のエラーです。
掲示したコードのどこにgがあるか調べてみてください。
アジサン
会議室デビュー日: 2007/01/20
投稿数: 3
投稿日時: 2007-01-20 18:01
引用:

未記入さんの書き込み (2007-01-20 09:20) より:
引用:

エラー内容
シンボルを解決できません
シンボル:変数g
場所  :Starのクラス
    this.paint(g):



変数gって、どこにあるんですか?という意味のエラーです。
掲示したコードのどこにgがあるか調べてみてください。


回答ありがとうございます
Grapics g; を追加したところコンパイルはできましたが
別なエラー(lang.NullPointerException)が発生してしまいました。


public void paint(Graphics g){ g.fillRect(kk,ll,1,1); }
のようにメソッドの引数がクラスのようなメソッドを他のクラスやメソッドで
呼び出して実行するにはどうすれば良いのでしょうか?
このプログラムの場合はvoid show()メソッドで呼び出したいのですが。
ご教授をお願い致します
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-01-20 19:27
恐らく今は一から作り込んでいく段階にないのだと思います。
今の状態から動くところまで指導してもらうのは結構骨が折れますよ。
まずは世の中に転がっているサンプルを動かすところから始めましょう。
nekoyama
ベテラン
会議室デビュー日: 2005/03/12
投稿数: 71
投稿日時: 2007-01-20 20:08
引用:

アジサンさんの書き込み (2007-01-20 18:01) より:
回答ありがとうございます
Grapics g; を追加したところコンパイルはできましたが
別なエラー(lang.NullPointerException)が発生してしまいました。


コンパイルエラーをなくすためだけに、メンバー変数に、単純にprivate Graphics gとか、書いている気がします。

引用:

public void paint(Graphics g){ g.fillRect(kk,ll,1,1); }
のようにメソッドの引数がクラスのようなメソッドを他のクラスやメソッドで
呼び出して実行するにはどうすれば良いのでしょうか?


掲示されたコードは読んでませんが、呼び出し方自体は、上記のとおりでよいです。

引用:

恐らく今は一から作り込んでいく段階にないのだと思います。
今の状態から動くところまで指導してもらうのは結構骨が折れますよ。
まずは世の中に転がっているサンプルを動かすところから始めましょう。


同感です。
アジサンの状態は、APIの使用方法云々とか言う状態ではないので、
まず、サンプルをいろいろ変更して動作させながら、その都度発生する
コンパイルエラーや例外を自分で解決していくことで、力がつきます。

一度、JAVAの基本が網羅(10日で学ぶ〜、やさしい〜、今日から〜、すぐに身につく〜とかの甘い奴でなく)されている書籍やWebサイト等で体系的に学ばれた方がよいでしょう。
アジサン
会議室デビュー日: 2007/01/20
投稿数: 3
投稿日時: 2007-01-20 23:34
引用:

未記入さんの書き込み (2007-01-20 20:08) より:
引用:

アジサンさんの書き込み (2007-01-20 18:01) より:
回答ありがとうございます
Grapics g; を追加したところコンパイルはできましたが
別なエラー(lang.NullPointerException)が発生してしまいました。


コンパイルエラーをなくすためだけに、メンバー変数に、単純にprivate Graphics gとか、書いている気がします。

引用:

public void paint(Graphics g){ g.fillRect(kk,ll,1,1); }
のようにメソッドの引数がクラスのようなメソッドを他のクラスやメソッドで
呼び出して実行するにはどうすれば良いのでしょうか?


掲示されたコードは読んでませんが、呼び出し方自体は、上記のとおりでよいです。

引用:

恐らく今は一から作り込んでいく段階にないのだと思います。
今の状態から動くところまで指導してもらうのは結構骨が折れますよ。
まずは世の中に転がっているサンプルを動かすところから始めましょう。


同感です。
アジサンの状態は、APIの使用方法云々とか言う状態ではないので、
まず、サンプルをいろいろ変更して動作させながら、その都度発生する
コンパイルエラーや例外を自分で解決していくことで、力がつきます。

一度、JAVAの基本が網羅(10日で学ぶ〜、やさしい〜、今日から〜、すぐに身につく〜とかの甘い奴でなく)されている書籍やWebサイト等で体系的に学ばれた方がよいでしょう


厳しいご指摘ありがとうございます。しかしこのプログラムは、問題のpaintメソッドを
取り除くと動くんです。stars.txtファイルからデータを読み込み、座標を変換して、その結果を表示しました。paint メソッドの取り扱い方法が解れば解決すると思うんですが。どうかご教授をお願い申し上げます。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-01-21 00:02
>paint メソッドの取り扱い方法が解れば
メソッドの使い方以前に、ウィンドウの表示の仕方、グラフィックス周りの API の利用方法など学ぶべき事がたくさんあると思います。
さらに、API 以前にコンパイルエラーの対処の仕方やどういう状況で NullPointerException が発生し得るのか、といったプログラミングの基本的な部分も学ぶ必要があると思います。
それらを一気に学ぶのは難しいのでまずは雛形になるサンプルを見つけてコンパイル、実行することをオススメしているわけです。

もちろんどなたかがんばって答えを教えてくれるかもしれません。
しかしそれは、「とりあえず動いた」状態になるだけです。その答えが知識として積み重なって応用が効く状態にはならないのではないかと個人的に思っています。

ここらへん↓など読むと体系的に学べると思います。
http://java.sun.com/docs/books/tutorial/uiswing/painting/index.html
Java の基本自体を学びたければこちら↓でしょうか。
http://java.sun.com/docs/books/tutorial/

もちろん似たような情報が載っている日本語のサイト、本などもたくさんあると思います。

[ メッセージ編集済み 編集者: インギ 編集日時 2007-01-21 00:07 ]
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-01-22 11:43
自分が始めてWindowsプログラムをしたときのことを思い出しました。

自分の思うとおりのアルゴリズムを書けばよかったそれまでのプログラムと
決定的に違ったのは、共通部に組み込まれて動くプログラムは
ルールを守って記述しないと動かない
、ということでした。
大きなパラダイムシフトでしたし、大変苦労したことを覚えています。
自分勝手なやり方では共通部品を使うこともままならない…

JavaのAWTのプログラムも同じで、Graphics gをそのへんで宣言して
newして使うというわけではなく、AWTの共通部から渡されるGraphicsに
自分の処理範囲の画像を記述するという作法を理解しないといけません。

具体的にはjava.awt.Componentの継承クラスを作って
public void paint(Graphics g)をオーバーライドして
そこにGraphicsに描画を行う処理を記述します。
Componentを継承しているクラスにはpaintメソッドがあることが保障されるので
AWTの共通部がこのメソッドを通して描画処理を行わせるのですね。

そのへんは書き始めると1冊の書籍になるような分量なので
JavaのGUIについて解説している本を購入して読むのが一番の近道でしょう。

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