参考にしたのは、
四角じゃないコンポーネントを作りたい,の巻
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) { } }