2015-01-17 45 views
0

我有一個類,單擊時繪製一個點,再次單擊它時會繪製另一個點並在它們之間繪製線條。如何觸發多個MouseEvent事件

public class SlopeComponent extends JComponent 
{ 
private static final long serialVersionUID = 1L; 
public SlopeComponent() 
{ 
    point1 = null; 
    point2 = null; 
    class MouseSpy extends MouseAdapter 
    { 
     public void mousePressed(MouseEvent event) 
     { 
      double x1 = rxPixel(event.getX()); 
      double y1 = ryPixel(event.getY()); 
      point1 = new Point2D.Double(x1, y1); 

      double x2 = rxPixel(event.getX()); 
      double y2 = ryPixel(event.getY()); 
      point2 = new Point2D.Double(x2, y2); 

      repaint(); 
     } 
    } 
    MouseSpy listener = new MouseSpy(); 
    addMouseListener(listener); 
} 
public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D)g; 
    Axes axes = new Axes(xPixel(XMIN), xPixel(XMAX), yPixel(YMIN), yPixel(YMAX), 
      xPixel(0), yPixel(0), sWidth(1), sHeight(1)); 
    axes.drawAxes(g2);   //draw the axes 
    axes.drawTicks(g2); 

    if(point1 != null || point2 != null) 
    { 
     plotPoint(g2, point1); 
     plotPoint(g2, point2); 
     double x1 = point1.getX(); 
     double y1 = point1.getY(); 
     double x2 = point2.getX(); 
     double y2 = point2.getY(); 
     drawSlope(g2, x1, y1, x2, y2); 
    } 
} 
public void drawSlope(Graphics2D g2, double x1, double y1, double x2, double y2) //draw the lines 
{ 
    Point2D.Double p1 = new Point2D.Double(xPixel(x1), yPixel(y1)); 
    Point2D.Double p2 = new Point2D.Double(xPixel(x2), yPixel(y2)); 
    Line2D.Double line = new Line2D.Double(p1, p2); 
    g2.draw(line); 
} 
public void plotPoint(Graphics2D g2, Point2D.Double p)     //plot the point 
{ 
    double x = p.getX(); 
    double y = p.getY(); 
    double radius = 5 * (XMAX - XMIN)/getWidth(); 
    Ellipse2D.Double point = new Ellipse2D.Double(xPixel(x - radius), yPixel(y + radius), 
      sWidth(2 * radius), sHeight(2 * radius)); 
    g2.fill(point); 
    double xR = Rounding.round(x, 1); 
    double yR = Rounding.round(y, 1); 
    double gap = 6 * (XMAX - XMIN)/getWidth(); 
    g2.drawString("(" + xR + ", " + yR + ")", (float)xPixel(x + gap), (float)yPixel(y + gap)); 
} 
public double rxPixel(double x) 
{ 
    return x * (XMAX - XMIN)/(getWidth() - 1) + XMIN; 
} 
public double ryPixel(double y) 
{ 
    return y * (YMIN - YMAX)/(getHeight() - 1) + YMAX; 
} 
public double xPixel(double xuser) 
{ 
    return (xuser - XMIN) * (getWidth() - 1)/(XMAX - XMIN); 
} 
public double yPixel(double yuser) 
{ 
    return (yuser - YMAX) * (getHeight() - 1)/(YMIN - YMAX); 
} 
public double sHeight(double yuser) 
{ 
    return yuser * (getHeight() - 1)/(YMAX - YMIN); 
} 
public double sWidth(double xuser) 
{ 
    return xuser * (getWidth() - 1)/(XMAX - XMIN); 
} 
private static final double XMIN = -10; 
private static final double XMAX = 10; 
private static final double YMIN = -10; 
private static final double YMAX = 10; 
private Point2D.Double point1; 
private Point2D.Double point2; 
} 

然而,當我嘗試運行此,它借鑑了最重要的是對方,那麼該行的頂部兩個點。我知道在我的構造函數中,我在同一事件上調用getX()和getY(),以便point1和point2具有座標。我如何調用多個事件以避免這種情況發生。

回答

0

可以計算點擊次數,你可以做這樣的事情

int count = 0; 
public void mousePressed(MouseEvent event) 
    { 
     if(count == 0){ 
     double x1 = rxPixel(event.getX()); 
     double y1 = ryPixel(event.getY()); 
     point1 = new Point2D.Double(x1, y1); 
     count++; 
     } 
     if(count == 1){ 
     double x2 = rxPixel(event.getX()); 
     double y2 = ryPixel(event.getY()); 
     point2 = new Point2D.Double(x2, y2); 
     repaint(); 
     } 
    }