プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (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);
 }
}
------------------------------------------------
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/05/20 17:36

Javaの2Dグラフィクスを最初からちゃんと勉強しましょう。


出発点は:
http://java.sun.com/docs/books/tutorial/2d/TOC.h …

http://java.sun.com/products/java-media/2D/sampl …

矢印を描くコードの参考例は、ネット上にたくさんあります。ここではそのひとつを:
http://forum.java.sun.com/thread.jspa?forumID=20 …
    • good
    • 0
この回答へのお礼

すぐの回答、ありがとうございます。

わかりました。まだまだ不勉強だったんですね。
教えてくださってありがとうございます。

頑張ってみます☆

お礼日時:2008/05/12 10:59

長い線を1本と、小さな線を2本描くのでOK?


それとも、矢の部分は図形?

どっちにしても、いちいちdrawLine()するのでなく、そのようなShapeオブジェクト、とくにPath2Dオブジェクトを定義して、角度などはオブジェクトをコンストラクトするときのパラメータにすればよいでしょう。
    • good
    • 0
この回答へのお礼

さっそくの回答ありがとうございます。
はい、長い線を1本と、小さい線を2本です。

すいません・・・。
>>Shapeオブジェクト、とくにPath2Dオブジェクト
とは、何のことかがわからないのですが・・・。
まだまだ、勉強不足で・・・。
教えてください。

お礼日時:2008/05/12 01:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!