ドラックできる曲線を作ってみる。

参考にしたのは、

四角じゃないコンポーネントを作りたい,の巻

http://www2u.biglobe.ne.jp/~kaduhiko/java_05.html

で、これを線でもできないものかと、線といっても直線だと

簡単に実現できそうだからつまらん。

ベジェ曲線でやってみる。

Javaで、ベジェ曲線を描くには、QuadCurve2Dを使う

とりあえず書いたコードは、下記のようになるが、 線上をぴたっと選ばなくても、エリアを触るとドラックできてしまう。 intersectsとかつかっても、線上ではなく、エリアが触れるだけというありさま。

だから自分でintersectsをオーバーライドによる上書きをすればいいのだ。 アルゴリズムは自分で理解するしかない。

ベジェ曲線なるものの、アルゴリズムを理解せねばならない。

部品は、JComponentとJPanelどっちを継承したらいいのかというとJComponentのようだ。

以下、サンプルコード

public class LineComponent  extends JComponent
implements MouseListener,MouseMotionListener {
   /******************************************************************************
   フィールド
*****************************************************************************/ 
   /**
    * マウス・クリック時の座標のインスタンス変数です.
    */
   private Point pressedPoint;
   /**
    * 自身を描画するための円のインスタンス変数です.
    */
   private QuadCurve2D.Double line;
   /**
    * グラデーションのインスタンス変数です.
    */
   private GradientPaint gradient;
   /**
    * 透明度のインスタンス変数です.
    */
   private Composite comp;
 /******************************************************************************
   コンストラクタ
******************************************************************************/
   /**
    * コンストラクタです.
    */
   public LineComponent() {
     // 親クラスのコンストラクタ呼び出し
     super();
     // マウス・イベント・リスナの登録
     addMouseListener(this);
     addMouseMotionListener(this);
     // インスタンス変数の初期化
     pressedPoint=null;
     line=null;
     gradient=null;
     comp=null;
   }
 /******************************************************************************
   メソッド
*****************************************************************************/ 
 /******************************************************************************
   ビュー
******************************************************************************/
   /**
    * 背景を描画するメソッドです.
    * 
    * @param g グラフィックス
    */
   protected void paintComponent(Graphics g) {
     // 親クラスのメソッドを呼び出し
     super.paintComponent(g);
     Graphics2D g2 = (Graphics2D)g;
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
     RenderingHints.VALUE_ANTIALIAS_ON);
     BasicStroke wideStroke = new BasicStroke(4.0f);
     g2.setStroke(wideStroke);
     g2.draw(new QuadCurve2D.Double(50, 140, 60, 50, 250, 120));   
   }
 /******************************************************************************
   コントローラ
*****************************************************************************/ [#wea96979]
   /**
    * マウス・イベント用メソッドです.
    * コンポーネント上でマウス・ボタンが押されると呼び出されます.
    * 
    * @param me マウス・イベント
    */
   public void mousePressed(MouseEvent me) {
     // 押されたときのマウス座標を取得
     pressedPoint=new Point(me.getX(),me.getY());
     // 自身の円の範囲に入っているか判定
     if(line!=null&&!line.intersects(me.getX(),me.getY(),2,2)) {
       pressedPoint=null;
     }
   }
   /**
    * マウス・イベント用メソッドです.
    * コンポーネント上でマウス・ボタンが離されると呼び出されます.
    * 
    * @param me マウス・イベント
    */
   public void mouseReleased(MouseEvent me) {
     pressedPoint=null;
   }
   /**
    * マウス・イベント用メソッドです.
    * コンポーネント上でマウス・ボタンがクリックされると呼び出されます.
    * 
    * @param me マウス・イベント
    */
   public void mouseClicked(MouseEvent me) {
   }
   /**
    * マウス・イベント用メソッドです.
    * コンポーネント上にマウスが入ると呼び出されます.
    * 
    * @param me マウス・イベント
    */
   public void mouseEntered(MouseEvent me) {
   }
   /**
    * マウス・イベント用メソッドです.
    * コンポーネント上からマウスが出ると呼び出されます.
    * 
    * @param me マウス・イベント
    */
   public void mouseExited(MouseEvent me) {
   }
   /**
    * マウス・モーション・イベント用メソッドです.
    * コンポーネント上でドラッグされると呼び出されます.
    * 
    * @param me マウス・イベント
    */
   public void mouseDragged(MouseEvent me) {
     // 自身の円の範囲でドラッグされているか判定
     if(pressedPoint!=null) {
       // 座標の取得
       Point location=getLocation();
       // 座標の増減計算
       location.x+=me.getX()-pressedPoint.x;
       location.y+=me.getY()-pressedPoint.y;
       // 座標の設定
       setLocation(location);
     }
   }
   /**
    * マウス・モーション・イベント用メソッドです.
    * コンポーネント上でマウスが動くと呼び出されます.
    * 
    * @param me マウス・イベント
    */
   public void mouseMoved(MouseEvent me) {
   }
 }

できれば

下記のような絵を描けるエディターを作りたい http://www.genome.jp/kegg/pathway/map/map01100.html

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS