*ドラックできる曲線を作ってみる。 [#qc5b8b6b]

参考にしたのは、

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

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) {
    }
  }

*できれば [#w30d3b96]
下記のような絵を描けるエディターを作りたい
http://www.genome.jp/kegg/pathway/map/map01100.html

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