- ベストアンサー
星座を描くアプレットを作成する方法
- 配列に格納された座標を使って星座を描くアプレットを作成する方法について解説します。
- drawConstellationメソッドを定義し、与えられた配列データをもとに星座を描画します。
- drawConstellationメソッドは、描画領域と星座のX座標値の配列、Y座標値の配列を引数として受け取ります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
プログラムが出来たんですね。 おめでとうございます♪ さて、追加の質問の内容の“プログラミングらしい書き方”についてですが、実は文字のサイズを取得して表示位置を決定すると言う方法が存在します。 それはFontMetricsクラスを使用する方法ですが、クラス自体は、GraphicsクラスからgetFontMetrics()によって取得することが可能です。 今回の質問された問題からすると、使用するのは、FontMetricsクラスの「stringWidth(String)」と「getHeight()」メソッドです^^ ・stringWidth(String)メソッドでは、引数で与えた文字列を画面 に表示しようとした時に使用する横幅(Pixel)を取得します。 ・getHeight()メソッドでは、文字列を画面に表示しようとした時 に使用する縦幅(Pixel)を取得します。 以上文字の横幅と縦幅を取得する二つのメソッドですが、取得する文字サイズのフォントは、Graphicsクラスで設定[setFont(Font)]したフォントから取得されます。 つまり、GraphicsクラスのsetFont(Font)により、フォントサイズを大きくしていると、FontMetricsクラスでgetHeight()と文字の高さを取得すると、フォントを変更しなかった時に比べて大きな値が取れると言うことになりますね^^ 参考URLに例を使用した使い方の説明がされていますので、是非参考にしてみてください^^
その他の回答 (2)
- coral0
- ベストアンサー率92% (13/14)
下の補足に書かれていたソースは惜しいですね^^; アプレット上に何も表示されなかったのは、Constellationクラスの中にpaintメソッドが無く、描画処理を行っていなかった為です。 Constellationクラスの中にpaintメソッドを追加してあげましょう^^ アプレット描画時には、このpaintメソッドが必ず呼び出されます ----------------------------- paint(Graphics g) { ~描画処理を記述~ } ----------------------------- 後、補足に書かれていたものでは、星座の座標を記述した変数がdrawConstellationメソッドの中に入ってしまっていますね これでは、引数で座標を渡してあげても意味がなくなってしまいますから、drawConstellationメソッドの外へ出してあげましょう^^ あくまでも、bdXとbdYの星座座標を保持する配列は、drawConstellationメソッドに渡すまでの役割で、drawConstellationメソッド内では、渡された引数の座標を元に星座描画処理を行うと言った感じです。 殆ど答えに近いものを書いてしまいますが、以下のソースを見て、少し流れを追って見てください^^ ただ、以下の例でも完成例ではありません。 ★を表示する位置がおかしいはずなので、そこは修正を加えて見てくださいね♪ ----------------------------------------- import java.applet.Applet; import java.awt.Graphics; public class Constellation extends Applet { String point = "★"; // 点 int bdX[] = {55, 75, 115, 115, 135, 155, 195}; // 星座の座標(X軸)配列 int bdY[] = {35, 15, 35, 75, 95, 115, 135}; // 星座の座標(Y軸)配列 public void drawConstellation(int wx[], int wy[]) { // X点配列数とY点配列数が一致していないと処理しません if(wx.length != wy.length) return; Graphics g = super.getGraphics(); g.drawPolyline( wx, wy, wx.length ); // 星座を描画 for(int k = 0; k < wx.length; k++) { g.drawString(point, wx[k], wy[k]); } } public void paint(Graphics g) { drawConstellation(bdX, bdY); // 星座を描画 } } -----------------------------------------
お礼
coral0さん、本当にありがとうございました。 coral0さんのおかげで無事に出来ました! 本当に勉強不足ですみませんでした… でもプログラミングって面白いものですね~。 もっと勉強していろいろなことをやってみたいです! ところで★を表示する位置の修正なのですが、 g.drawString(point, wx[k] - 5, wy[k] + 5); と、無理矢理だったのですが、これで良かったのでしょうか? ほかにプログラミングらしい書き方があったりするのでしょうか? 最後の最後まですみません…
- coral0
- ベストアンサー率92% (13/14)
星座(線)を描くには、幾つか方法がありますが、この問題文からすると、多角形を描くのと同じ方法を用いればすぐに解けるかと思います 作成する順序としては、以下のようになります 1.Appletクラスを作成し、そのクラス内に、星座の各座標を 引数として渡すdrawConstellationメソッドを作成 2.Graphicsクラスの中にdrawPolylineと言うメソッドがあり、 X座標配列,Y座標配列を引数として渡すことにより多角形を 描くことが出来るので、drawConstellationメソッド内に drawPolylineを使用した星座描画処理を記述 3.Graphicsクラスの中にdrawStringと言うメソッドがあり、 描画文字列,配置X座標,配置Y座標 を引数として渡すこと により指定座標に文字列を描くことが出来るので、星座の 各座標に文字"★"を描画する処理をdrawConstellation メソッド内に追記 以上で、星座を描画できるクラスが作成できます。 Javaを勉強中のようなので、答えはあえて書きませんが、初めてでは、ヒントがこれだけでは難しいと思いますので、一部の処理部分だけ書いておきますね 星座を描画する処理: (g=Graphicsクラス, bdX=星座X座標配列, bdY=星座Y座標配列) ---------------------------------------------- g.drawPolyline( bdX, bdY, bdX.length ); ---------------------------------------------- 星座の各座標に★を描画(文字表示座標の調節はしていません): (g=Graphicsクラス, bdX=星座X座標配列, bdY=星座Y座標配列) ---------------------------------------------- for(int k = 0; k < bdX.length; k++) { g.drawString("★", bdX[k], bdY[k]); } ---------------------------------------------- 参考URLも載せておきましたので、難しいかもしれませんが、サイトを見ながら宿題頑張ってください♪ p(^-^)q
補足
coral0さん、丁寧な回答ありがとうございます。 ですが、上記に書かれているやり方で試してみたのですが、なんだか上手くいきません(ノД`) コンパイルは出来たのですが、アプレットが表示されません…。 どこがいけないのでしょうか? 今一度アドバイスしていただけませんでしょうか? (全然違ってたりして…) ================================================= import java.awt.*; import java.applet.*; public class Constellation extends Applet { public void drawConstellation(Graphics g, int[] xarray, int[] yarray) { int bdX[] = {55, 75, 115, 115, 135, 155, 195}; int bdY[] = {35, 15, 35, 75, 95, 115, 135}; g.drawPolyline(bdX, bdY, bdX.length); for (int i = 0; i < bdX.length; i++) { g.drawString("★", bdX[i], bdY[i]); } } } =================================================
お礼
coral0さん。 最後まで本当にありがとうございました。 これからは、私もcoral0さんのように人に教えられるくらいまで、頑張って勉強していきたいと思います。 このたびは本当に助かりました。 ありがとうございました。