遇到一问题:new 一个Line2D()响应鼠标事件(鼠标进入图形时候图标形状变成十字状)的时候不能被选中,而new一个Rectangle()或Ellipse()可以被选中;这是为什么?如何将Line2D()变为一个闭合图形,从而使之可选呢?谢谢!

解决方案 »

  1.   

    呵呵,正在看Oreilly的java2D
    给你一个例子,你看一下是如何选中的import java.awt.Dimension;
    import java.awt.Frame;
    import java.awt.Toolkit;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;public class ApplicationFrame extends Frame{
    /**
     * 
     */
    private static final long serialVersionUID = 5615364649875351782L; public ApplicationFrame() {
    this("ApplicationFrame v1.0");
    }

    public ApplicationFrame(String title) {
    super(title);
    createUI();
    }

    protected void createUI() {
    setSize(500, 400);
    center();
    addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosed(WindowEvent e) {
    dispose();
    System.exit(0);
    }
    });
    }

    public void center() {
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    Dimension frameSize = getSize();
    int x = (screenSize.width - frameSize.width) / 2;
    int y = (screenSize.height - frameSize.height) / 2;
    setLocation(x, y);
    }
    }
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Shape;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    import java.awt.geom.CubicCurve2D;
    import java.awt.geom.Line2D;
    import java.awt.geom.Point2D;
    import java.awt.geom.QuadCurve2D;
    import java.awt.geom.Rectangle2D;public class DragKing extends ApplicationFrame implements MouseListener, MouseMotionListener{
    /**
     * 
     */
    private static final long serialVersionUID = -3997715010627598331L;
    protected Point2D[] mPoints;
    protected Point2D mSelectedPoint;

    public static void main(String[] args) {
    new DragKing();
    }

    public DragKing() {
    super("DragKing v1.0");
    setSize(300, 300);
    center();
    mPoints = new Point2D[9];
    //Cubic curve
    mPoints[0] = new Point2D.Double(50, 75);
    mPoints[1] = new Point2D.Double(100, 100);
    mPoints[2] = new Point2D.Double(200, 50);
    mPoints[3] = new Point2D.Double(250, 75);

    //Quad curve
    mPoints[4] = new Point2D.Double(50, 175);
    mPoints[5] = new Point2D.Double(150, 150);
    mPoints[6] = new Point2D.Double(250, 175);

    //Line
    mPoints[7] = new Point2D.Double(50, 275);
    mPoints[8] = new Point2D.Double(250, 275);
    mSelectedPoint = null;

    addMouseListener(this);
    addMouseMotionListener(this);

    setVisible(true);
    }

    @Override
    public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;

    //Draw the tangents
    Line2D tangent1 = new Line2D.Double(mPoints[0], mPoints[1]);
    Line2D tangent2 = new Line2D.Double(mPoints[2], mPoints[3]);
    g2.setPaint(Color.gray);
    g2.draw(tangent1);
    g2.draw(tangent2);

    //Draw the cubic curve
    CubicCurve2D c = new CubicCurve2D.Float();
    c.setCurve(mPoints, 0);
    g2.setPaint(Color.black);
    g2.draw(c);

    //Draw the tangents
    tangent1 = new Line2D.Double(mPoints[4], mPoints[5]);
    tangent2 = new Line2D.Double(mPoints[5], mPoints[6]);
    g2.setPaint(Color.gray);
    g2.draw(tangent1);
    g2.draw(tangent2);

    //Draw the quadratic curve
    QuadCurve2D q = new QuadCurve2D.Float();
    q.setCurve(mPoints, 4);
    g2.setPaint(Color.black);
    g2.draw(q);

    //Draw the line
    Line2D l = new Line2D.Double();
    l.setLine(mPoints[7], mPoints[8]);
    g2.setPaint(Color.black);
    g2.draw(l);

    for(int i=0; i<mPoints.length; i++) {
    if(mPoints[i] == mSelectedPoint) {
    g2.setPaint(Color.red);
    }else {
    g2.setPaint(Color.blue);
    }
    g2.fill(getControlPoint(mPoints[i]));
    }

    } protected Shape getControlPoint(Point2D p) {
    int side = 4;
    return new Rectangle2D.Double(p.getX() - side / 2, p.getY() -side / 2, side, side);
    }
    public void mouseDragged(MouseEvent e) {
    if(null != mSelectedPoint) {
    mSelectedPoint.setLocation(e.getPoint());
    repaint();
    }

    } public void mouseMoved(MouseEvent e) {

    } public void mouseClicked(MouseEvent e) {

    } public void mouseEntered(MouseEvent e) {

    } public void mouseExited(MouseEvent e) {

    } public void mousePressed(MouseEvent e) {
    mSelectedPoint = null;
    for(int i=0; i<mPoints.length; i++) {
    Shape s = getControlPoint(mPoints[i]);
    if(s.contains(e.getPoint())) {
    mSelectedPoint = mPoints[i];
    break;
    }
    }
    repaint();
    } public void mouseReleased(MouseEvent e) {

    }}
      

  2.   

    请问Dazzlingwinter,如何让鼠标在直线之上的时候变为十字状态,还有拖动的时候可整体移动呢;ps你的以上回复很有帮助~
      

  3.   

    setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR))
    貌似是这个
      

  4.   

    LS修改鼠标形状的正解
    当移出所属区域是应设置回原来形状
    LZ,移动图形的我已经写好了,发你邮箱了,注意查收,就不贴在这里了,O(∩_∩)O~