- 追加された行はこの色です。
- 削除された行はこの色です。
*ドラックできる曲線を作ってみる。 [#qc5b8b6b]
参考にしたのは、ドラックできる円のコード
参考にしたのは、
四角じゃないコンポーネントを作りたい,の巻
http://www2u.biglobe.ne.jp/~kaduhiko/java_05.html
で、これを線でもできないものかと、線といっても直線だと
簡単に実現できそうだからつまらん。
ベジェ曲線でやってみる。
Javaで、ベジェ曲線を描くには、QuadCurve2Dを使う
とりあえず書いたコードは、下記のようになるが、
線上をぴたっと選ばなくても、エリアを触るとドラックできてしまう。
intersectsとかつかっても、線上ではなく、エリアが触れるだけというありさま。
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) {
}
}