• ベストアンサー

矢印を描画

JAVAで矢印を描画したいのですが、どうしたらいいのかわかりません。 矢印の位置をFOR文でx、yの値を変えながら、いくつもつくりたいのですが・・・。また、角度も変えていきたいのですが・・・。 なにかそのような命令があるのでしょうか?? ないのなら、どう書いたらいいか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.2

Javaの2Dグラフィクスを最初からちゃんと勉強しましょう。 出発点は: http://java.sun.com/docs/books/tutorial/2d/TOC.htmlhttp://java.sun.com/products/java-media/2D/samples/suite/index.html 矢印を描くコードの参考例は、ネット上にたくさんあります。ここではそのひとつを: http://forum.java.sun.com/thread.jspa?forumID=20&threadID=5190827

ryouou
質問者

お礼

すぐの回答、ありがとうございます。 わかりました。まだまだ不勉強だったんですね。 教えてくださってありがとうございます。 頑張ってみます☆

その他の回答 (2)

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.3

汎用性/再利用性のある矢印線オブジェクトを作ってみました。大急ぎで作ったのでアラがあると思いますが、参考になれば幸いです。 ----------------------------------------------------- /* 片方だけ矢がある矢印線 */ 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);  } } ------------------------------------------------

ryouou
質問者

お礼

わざわざ、ありがとうございます☆ 自分でも、ちゃんとつくれるよう、_ranco_さんのをみながら、 勉強します(^^)

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

長い線を1本と、小さな線を2本描くのでOK? それとも、矢の部分は図形? どっちにしても、いちいちdrawLine()するのでなく、そのようなShapeオブジェクト、とくにPath2Dオブジェクトを定義して、角度などはオブジェクトをコンストラクトするときのパラメータにすればよいでしょう。

ryouou
質問者

お礼

さっそくの回答ありがとうございます。 はい、長い線を1本と、小さい線を2本です。 すいません・・・。 >>Shapeオブジェクト、とくにPath2Dオブジェクト とは、何のことかがわからないのですが・・・。 まだまだ、勉強不足で・・・。 教えてください。

関連するQ&A