- ベストアンサー
矢印を描画
JAVAで矢印を描画したいのですが、どうしたらいいのかわかりません。 矢印の位置をFOR文でx、yの値を変えながら、いくつもつくりたいのですが・・・。また、角度も変えていきたいのですが・・・。 なにかそのような命令があるのでしょうか?? ないのなら、どう書いたらいいか教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Javaの2Dグラフィクスを最初からちゃんと勉強しましょう。 出発点は: http://java.sun.com/docs/books/tutorial/2d/TOC.html と http://java.sun.com/products/java-media/2D/samples/suite/index.html 矢印を描くコードの参考例は、ネット上にたくさんあります。ここではそのひとつを: http://forum.java.sun.com/thread.jspa?forumID=20&threadID=5190827
その他の回答 (2)
- _ranco_
- ベストアンサー率58% (126/214)
汎用性/再利用性のある矢印線オブジェクトを作ってみました。大急ぎで作ったのでアラがあると思いますが、参考になれば幸いです。 ----------------------------------------------------- /* 片方だけ矢がある矢印線 */ import java.awt.*; import java.awt.geom.*; import javax.swing.*; import static java.awt.RenderingHints.*; public class OneSideArrow extends Path2D.Float{ enum Side{LEFT, RIGHT}; Point start; Point end; double length; double slope; //radian int angle; //degree double theta; //radian int barblen; //起点,終点,矢羽根の角度,矢羽根の長さ public OneSideArrow(Point s, Point e, int a, int b){ start = s; end = e; length = start.distance(end); slope = getSlope(start, end); angle = a; theta = Math.toRadians(angle); barblen = b; moveTo(start); append(new Line2D.Double(start, end), false); attachBarb(); } public void attachBarb(){ append(getBarb(Side.LEFT), false); append(getBarb(Side.RIGHT), false); } private Line2D getBarb(Side s){ double slant = s == Side.LEFT ? slope + theta : slope - theta; double tipx = end.x - barblen * Math.cos(slant); double tipy = end.y - barblen * Math.sin(slant); return new Line2D.Double(end.x, end.y, tipx, tipy); } public double getSlope(Point ps, Point pe){ double dy = pe.y - ps.y; double dx = pe.x - ps.x; return (Math.atan2(dy, dx)); } public void moveTo(Point p){ moveTo((float)p.x, (float)p.y); } // このバージョンでは不使用 public void lineTo(Point p){ lineTo((float)p.x, (float)p.y); } /* テスト用のパネル */ static class DrawPanel extends JPanel{ Shape shape; RenderingHints rh; DrawPanel(Shape shp, int width, int height){ shape = shp; setPreferredSize(new Dimension(width, height)); setBackground(Color.white); rh = new RenderingHints(null); rh.put(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON); rh.put(KEY_STROKE_CONTROL, VALUE_STROKE_PURE); } public void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; g2.setRenderingHints(rh); g2.setStroke(new BasicStroke(2.0f)); g2.setPaint(Color.red); if (shape != null){ g2.draw(shape); } } } /* テスト */ public static void main(String[] args){ JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); OneSideArrow arrow = new OneSideArrow(new Point(15, 15), new Point(185, 175), 18, 13); DrawPanel dp = new DrawPanel(arrow, 200, 200); frame.getContentPane().add(dp, BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } } ------------------------------------------------
お礼
わざわざ、ありがとうございます☆ 自分でも、ちゃんとつくれるよう、_ranco_さんのをみながら、 勉強します(^^)
- _ranco_
- ベストアンサー率58% (126/214)
長い線を1本と、小さな線を2本描くのでOK? それとも、矢の部分は図形? どっちにしても、いちいちdrawLine()するのでなく、そのようなShapeオブジェクト、とくにPath2Dオブジェクトを定義して、角度などはオブジェクトをコンストラクトするときのパラメータにすればよいでしょう。
お礼
さっそくの回答ありがとうございます。 はい、長い線を1本と、小さい線を2本です。 すいません・・・。 >>Shapeオブジェクト、とくにPath2Dオブジェクト とは、何のことかがわからないのですが・・・。 まだまだ、勉強不足で・・・。 教えてください。
お礼
すぐの回答、ありがとうございます。 わかりました。まだまだ不勉強だったんですね。 教えてくださってありがとうございます。 頑張ってみます☆