2010-08-12 172 views
0

我有以下类旋转图像,当我给它的度数,它必须旋转,但它不工作,因为我想要的。问题是这样的,例如,如果我旋转90度,rotationCrossing()内的变量“currentRotationAngle”在旋转后逐渐设置为90。发生这种情况是因为我总是通过偏移量(10)增加该变量。旋转不工作,因为我想

下一次我想旋转180度,因为变量已经是90,它只旋转另一个90(90 + 90 = 180)而不是整个180度。我试图通过在旋转结束后在“stop()”方法中将“currentRotationAngle”设置为0来修复它,但它让旋转回到其起始位置。

这就是我想要的,当我给它度数时,我希望它完全旋转到从最后一个旋转位置开始的那个度数。请以下是班级。

public class CrossingPanel extends JPanel{ 

    private static final long serialVersionUID = 1L; 

    // private data members 
    private Image crossingImage; 
    private int currentRotationAngle; 
    private int imageWidth; 
    private int imageHeight; 
    private AffineTransform affineTransform; 
    private boolean clockwise; 
    private static int ROTATE_ANGLE_OFFSET = 10; 

    private boolean finishRotation = false; 
    private int degreesToTurn; 

    private static int LENGTH = 75; 
    private static int RAIL_LENGTH = 130; 
    private int ARROWLENGTH = 4; 
    private static int TICKSIZE = 10; 
    private GeneralPath path; 
    private int xCoordinate; 
    private int yCoordinate; 

    private javax.swing.Timer timer; 

    private void initialize(){ 
     //this.crossingImage = getImage("images/railCrossing.JPG"); 
     this.crossingImage = Toolkit.getDefaultToolkit().getImage("images/crossingsHorizontal.JPG"); 
     // MediaTracker mt = new MediaTracker(this); 
     // mt.addImage(this.crossingImage, 1); 
     this.path = new GeneralPath(); 
     this.imageWidth = this.getCrossingImage().getWidth(this); 
     this.imageHeight = this.getCrossingImage().getHeight(this); 
     this.affineTransform = new AffineTransform(); 
     this.setCurrentRotationAngle(0); 
     this.setDegreesToTurn(0); 
     timer = new javax.swing.Timer(20, new MoveListener()); 
      // timer.start(); 
    } 

    public CrossingPanel(int x, int y/*, BufferedImage img*/) { 

     this.setxCoordinate(x); 
     this.setyCoordinate(y); 
     this.setPreferredSize(new Dimension(50, 50)); 
     this.setBackground(Color.red); 
     TitledBorder border = BorderFactory.createTitledBorder("image"); 
     //this.setBorder(border); 
     this.setLayout(new FlowLayout()); 
     this.initialize(); 

    } 


    public GeneralPath getPath() { 
     return path; 
    } 
    public void setPath(GeneralPath path) { 
     this.path = path; 
    } 

    private void constructInterfaceComponents(){ 
    } 

    private Shape createVerticalRail(){ 
     //System.out.print("dddd: " + this.LENGTH + "\n"); 
     this.getPath().moveTo(0, LENGTH); 
     this.getPath().lineTo(RAIL_LENGTH,75); 
     float cm = 72/2.54f; 
     float lengthCentimeter = RAIL_LENGTH; 

     for (float i = 260.0f, j = 340; i >= 0; i -= 15.0f, j += 20) { 
       float tick = i * cm; 
      // path.moveTo(340, i); 
      // path.lineTo(360, i); 
     } 

     this.getPath().closePath(); 
     return this.getPath(); 
    } 

    public void paintComponent(Graphics grp){ 

     Rectangle rect = this.getBounds(); 
     Graphics2D g2d = (Graphics2D)grp; 

     //set the background color to black 
     g2d.setColor(Color.BLACK); 

     // g2d.draw(this.createVerticalRail()); 

     //set the translation to the mid of the component 

     this.getAffineTransform().setToTranslation(this.getxCoordinate(), this.getyCoordinate()); 

      //rotate with the rotation point as the mid of the image 
     this.getAffineTransform().rotate(Math.toRadians(this.getCurrentRotationAngle()), this.getCrossingImage().getWidth(this) /2, 
             this.getCrossingImage().getHeight(this)/2); 

     //draw the image using the AffineTransform 
     g2d.drawImage(this.getCrossingImage(), this.getAffineTransform(), this); 
    } 


    public void rotateCrossing(int degrees){ 
     // this condition is there to avoid division of zero 
      // and also there is no need to rotate 0 degrees 
      if(degrees == 0){ 
      this.stop(); 
      return; 
     } 
     currentRotationAngle += ROTATE_ANGLE_OFFSET; 

      if (currentRotationAngle % degrees == 0) { 
       timer.stop(); 
       this.finishRotation = true; 
      } 

     repaint(); 
    } 



    public int getDegreesToTurn() { 
     return degreesToTurn; 
    } 

    public void setDegreesToTurn(int degreesToTurn) { 
     this.degreesToTurn = degreesToTurn; 
    } 



    private class MoveListener implements ActionListener { 

      public void actionPerformed(ActionEvent e) { 

       rotateCrossing(degreesToTurn); 


     } 

    } 


    void start(int degreesToTurn) { 
      if (timer != null) { 
       timer.start(); 
      } 
      this.setDegreesToTurn(degreesToTurn); 
     } 

    void stop() { 
      timer.stop(); 
      this.setCurrentRotationAngle(0); 

     } 






    public Image getCrossingImage() { 
     return crossingImage; 
    } 
    public void setCrossingImage(Image crossingImage) { 
     this.crossingImage = crossingImage; 
    } 

    public int getCurrentRotationAngle() { 
     return currentRotationAngle; 
    } 
    public void setCurrentRotationAngle(int currentRotationAngle) { 
     this.currentRotationAngle = currentRotationAngle; 
    } 

    public int getImageWidth() { 
     return imageWidth; 
    } 
    public void setImageWidth(int imageWidth) { 
     this.imageWidth = imageWidth; 
    } 

    public int getImageHeight() { 
     return imageHeight; 
    } 
    public void setImageHeight(int imageHeight) { 
     this.imageHeight = imageHeight; 
    } 

    public AffineTransform getAffineTransform() { 
     return affineTransform; 
    } 
    public void setAffineTransform(AffineTransform affineTransform) { 
     this.affineTransform = affineTransform; 
    } 

    public boolean isClockwise() { 
     return clockwise; 
    } 
    public void setClockwise(boolean clockwise) { 
     this.clockwise = clockwise; 
    } 

    public int getxCoordinate() { 
     return xCoordinate; 
    } 
    public void setxCoordinate(int xCoordinate) { 
     this.xCoordinate = xCoordinate; 
    } 

    public int getyCoordinate() { 
     return yCoordinate; 
    } 
    public void setyCoordinate(int yCoordinate) { 
     this.yCoordinate = yCoordinate; 
    } 

    public javax.swing.Timer getTimer() { 
     return timer; 
    } 
    public void setTimer(javax.swing.Timer timer) { 
     this.timer = timer; 
    } 

    public boolean isFinishRotation() { 
     return finishRotation; 
    } 

    public void setFinishRotation(boolean finishRotation) { 
     this.finishRotation = finishRotation; 
    } 



} 

我想某人帮我修复它。

谢谢你们。

+0

请我加入了“旋转”的标签,因为我真正关心的不是处理旋转图像旋转。我在问你是否可以再次添加“旋转”标签。谢谢 – kap 2010-08-12 21:42:24

回答

0

这个方法很奇怪它的度参数的目的是什么? 我想你用相同的度数值多次调用这个方法。在这种情况下,您应该使用度数的绝对值(270不是180)。

public void rotateCrossing(int degrees){ 
    // this condition is there to avoid division of zero 
     if(degrees == 0){ 
     this.stop(); 
     return; 
    } 
    currentRotationAngle += ROTATE_ANGLE_OFFSET; 

     if (currentRotationAngle % degrees == 0) { // this line isn't correct I think 
      timer.stop(); 
      this.finishRotation = true; 
     } 

    repaint(); 
    } 

我建议下面的代码:

private class MoveListener implements ActionListener { 
    private int cyclesToGo; 
    public MoveListener(){ 
     cyclesToGo = CrossingPanel.this.degreesToTurn/ROTATE_ANGLE_OFFSET; // how many time to call repaint 
    } 

     public void actionPerformed(ActionEvent e) { 
      if (cyclesToGo-- > 0) rotateCrossing(); 
      else { 
       CrossingPanel.this.stop(); // call outer class methods 
       CrossingPanel.this.finishRotation = true; // call outer class methods 
      } 
     } 

} 
    // this method increments currentRotationAngle and calles repaint 
    public void rotateCrossing(){ 
     currentRotationAngle += ROTATE_ANGLE_OFFSET; 
     repaint(); 
    } 
+0

度数参数有助于第二个if()条件在旋转该度数后停止。 “currentRotationAngle”将逐渐增加偏移量,所以当您用度数取模时,它会在旋转该度数时停止旋转。例如,如果我想旋转90°,并且“currentRotationAngle”已经增加了90°的偏移量,那么两者的模为0,那么旋转将停止。我希望在这里清楚 – kap 2010-08-12 21:57:27

+0

但如果你想旋转90度,你必须调用(int i = 0; i <9; i ++)rotateCrossing(90)?增加currentRotationAngle 9次。我对么? – jethro 2010-08-12 21:58:50

+0

快速修复会将setDegreesToTurn body的setter更改为 this.degreesToTurn = degreesToTurn + currentRotationAngle; (currentRotationAngle%度== 0)到(currentRotationAngle ==度)。但我会重新考虑整个设计。 – jethro 2010-08-12 22:10:45

相关问题