- PR -

JAVA、グラフィックスについて

投稿者投稿内容
ひら
ぬし
会議室デビュー日: 2005/03/04
投稿数: 260
投稿日時: 2006-10-19 00:31
引用:

nagiseさんの書き込み (2006-10-18 17:32) より:
paintメソッドでファイルを読みにいくのはちょっとマズイのでは。


確かにそうでした。paintするたびにいちいちファイルを読みに行くのは
時間がかかってしまいます。失礼しました。


さて、ともさんのご質問の件ですが、ファイルから座標を読みとって、たくさんの
円を描きたいという要望を満たすには、ともさんにとっていくつものハードルを
越えなければならないと思います。恐らく、他言語を経験していて、何かのきっかけ
でJavaを始められたのではないでしょうか?
私も、Javaをやる前はC(++ではない)をやっていました。当時はJava=アプレットの
時代でした。mainから始めるのは良いとして、なぜわざわざnewをしなければならな
いのか?なぜファイル名と同じクラス名をnewで呼び出すのか?mainの中で
円を描画することはできないのか?paintメソッドとは何か?命名規則で決まって
いたとしても、Graphics gという変数はどこから代入されてくるのか?extendとは
何物か?インスタンス変数はグローバル変数とはどう違うのか?この辺のことを
すべて書こうとすると本が一冊書けてしまうくらいです。
関数のリファレンスに似た、APIリファレンスというのがあります。
しかし、これは、読むのにコツがいりますし、まずこれを理解したからといって
プログラミングをするのは不可能に近いものがあります。どうしたら理解
できるようになるかというと、できるだけ多くのサンプルコードを試してみる
しかないんですね。
たくさんの円を描きたいという要望ですので、ランダムで座標を算出して
ループで回してやればいいと思います。その前に、円を1個だけ描画する
ところから始められてはいかがでしょうか?

コード:

public void paint( Graphics g ) {
g.drawOval(200,200,100,100);
}
(main等は省略)


drawOvalメソッドのパラメータは、左から順にX座標・Y座標・幅・高さです。
必ずintで指定します。幅と高さが同じ場合、正円になりますし、違う場合は
横長もしくは縦長の楕円になります。

コード:

public void paint( Graphics g ) {
int x = 0;
int y = 0;
for (int idx = 0;idx < 100;idx++)
{
x = (int)(java.lang.Math.random() * 800.0);
y = (int)(java.lang.Math.random() * 600.0);
g.drawOval(x,y,100,100);
}
}
(main等は省略)



ちなみに、色の指定は、drawOvalメソッドは持っておらず、setColorメソッドを
使用します。太さの指定は、ちょっと厄介で、BasicStrokeというクラスを使用
します。drawOvalのかわりにfillOvalにすると、円の内部を塗りつぶします。
(サンプルコードは省略します。検索をかければ出てくると思いますので)


座標をランダムではなくファイルから読みこみを行いたいという場合は、
BufferedReaderを使うと1行ずつ読みこむようになります。また、XとYを
カンマで区切っておりますので、StringTokenizerを使えば良いと思います。
Stringからintへの変換はInteger.parseIntを使用します。これも
例外処理が必要となります。


[ メッセージ編集済み 編集者: ひら 編集日時 2006-10-19 00:34 ]
コーディングミスを修正

[ メッセージ編集済み 編集者: ひら 編集日時 2006-10-19 09:29 ]
とも
会議室デビュー日: 2006/10/16
投稿数: 11
投稿日時: 2006-10-19 14:40
nagiseさん、ひらさん
アドバイス&ソースありがとうございます!!!!
今・・・苦戦中です;;;

できなかったらまた教えてください(涙
とも
会議室デビュー日: 2006/10/16
投稿数: 11
投稿日時: 2006-10-20 14:26
>nagiseさん
引用:
import java.util.*;
import java.awt.*;
public class Hoge extends Frame {
/** コンソールから起動する際に呼ばれる */
public static void main(String[] args) {
// インスタンス作成
Hoge hoge = new Hoge();
// 座標の保持用。java.awt.Pointオブジェクトを格納する
List list = new ArrayList();
// データの読みこみ処理
// 略

// 読み込んだデータを設定
hoge.list = list;
// フレームを表示する処理
// 略
}


「データの読みこみ処理」というのが、先日聞いた
「java.io.FileReaderとjava.io.BufferedReader」を使ったものですよね?





引用:

public void paint(Graphics g) {
for (int i=0; i<this.list.size(); i++) {
Point p = (Point) this.list.get(i);
// Pointを利用して円を描く
// 略
}
}


Pointに、txtの数が入るんですか??
1つずつ数を読む読み方がわからないのですが・・・。



サンプルなどのある良い本(サイト)を、教えていただければ幸いです。
とも
会議室デビュー日: 2006/10/16
投稿数: 11
投稿日時: 2006-10-20 14:29
>ひらさん
Java言語もC言語も、ちょっと触った程度の学習しかしておらず、
いざ「Javaするぞ!」となっても、混乱してばかりです;;;
Javaで学習したのはGraphicsメインで、あとはボタンやテキストBOXをやりました。
(円や多角形、扇形の描画は一応やりました)
サンプル、いろいろ試してはいるのですが、なかなかちょうど良いものに出会えません。

引用:

座標をランダムではなくファイルから読みこみを行いたいという場合は、
BufferedReaderを使うと1行ずつ読みこむようになります。また、XとYを
カンマで区切っておりますので、StringTokenizerを使えば良いと思います。
Stringからintへの変換はInteger.parseIntを使用します。これも
例外処理が必要となります。


StringTokenizerで調べたのですが、使い方がよくわかりませんでした(汗
「,」で区切ったtxtの数字を、ひとつずつfillOval(○,○,100,100);の中に入れられるのですか??

また、サンプルなどのある良いページがあれば教えてください。
想馬
大ベテラン
会議室デビュー日: 2003/05/29
投稿数: 245
お住まい・勤務地: 神奈川・東京
投稿日時: 2006-10-20 14:37
引用:

ともさんの書き込み (2006-10-20 14:29) より:
StringTokenizerで調べたのですが、使い方がよくわかりませんでした(汗
「,」で区切ったtxtの数字を、ひとつずつfillOval(○,○,100,100);の中に入れられるのですか??

また、サンプルなどのある良いページがあれば教えてください。


StringTokenizerの使い方
_________________
己への戒め

「活動的な馬鹿より恐ろしいものはない」 by ゲーテ
とも
会議室デビュー日: 2006/10/16
投稿数: 11
投稿日時: 2006-10-20 14:43
>想馬さん
検索はしてみたんですよね…。
でもこの中から探してみます。ありがとうございます。
想馬
大ベテラン
会議室デビュー日: 2003/05/29
投稿数: 245
お住まい・勤務地: 神奈川・東京
投稿日時: 2006-10-20 14:52
区切り文字がカンマであるなら、

StringTokenizer( String str, String delim )

を使用しましょう。strには処理対象の文字列、delimには区切り文字。
あとはhasMoreTokensとnextTokenを調べましょう。

_________________
己への戒め

「活動的な馬鹿より恐ろしいものはない」 by ゲーテ
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2006-10-20 15:02
APIの検索ならここ!
http://javadocs.org/

英語だけどね

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