views:

96

answers:

2

Hi guys ,

I need your help please. I have spent hours trying to solve it but not working.

I have an image i am rotating when the user clicks on a button. But it is not working.

I would like to see the image rotating gradually till it stops but it doesn't. This it what it does. After i click the button, i don't see it rotating. But when i minimize and maximize the main window, i see the image just rotate(flip) fast like that. It does the rotation but i don't see it as it is doing. It just rotate in a second after minimize and maximize the main window.

I thimk the problem deals with updating the GUI as it is rotating but i don't know how to fix it.

these are the code . Please i have trimed down the code for easy reading.

public class KrusPanel extends JPanel{ 
     private Image crossingImage;
     private int currentRotationAngle;
     private int imageWidth;
     private int imageHeight;
     private AffineTransform affineTransform;
     private boolean clockwise; 
     private static int ROTATE_ANGLE_OFFSET = 2;

     private int xCoordinate;
     private int yCoordinate;

     private javax.swing.Timer timer;

     private void initialize(){

      this.crossingImage = Toolkit.getDefaultToolkit().getImage("images/railCrossing3.JPG");
      this.imageWidth = this.getCrossingImage().getWidth(this);
      this.imageHeight = this.getCrossingImage().getHeight(this);
      this.affineTransform = new AffineTransform();
      this.setCurrentRotationAngle(90);
      timer = new javax.swing.Timer(20, new MoveListener());

     } 

 public KrusPanel (int x, int y) {

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

 }


 public void paintComponent(Graphics grp){ 

           Rectangle rect = this.getBounds();
           Graphics2D g2d = (Graphics2D)grp;
           g2d.setColor(Color.BLACK);
           this.getAffineTransform().setToTranslation(this.getxCoordinate(), this.getyCoordinate());

           this.getAffineTransform().rotate(Math.toRadians(this.getCurrentRotationAngle()), this.getCrossingImage().getWidth(this) /2, 
                                   this.getCrossingImage().getHeight(this)/2);

          g2d.drawImage(this.getCrossingImage(), this.getAffineTransform(), this);
      }



 public void rotateCrossing(){
             this.currentRotationAngle += ROTATE_ANGLE_OFFSET;

             int test = this.currentRotationAngle % 90;
             if(test == 0){
              this.setCurrentRotationAngle(this.currentRotationAngle);
              timer.stop();

             }


         repaint(); 
 }



  private class MoveListener implements ActionListener {

         public void actionPerformed(ActionEvent e) {

            rotateCrossing();
            repaint();

     }

  }

//  There are getters and setters method here but i have removed them to make the code shorter. 



}




Next 2 Classes

// I have removed many thins in this class so simplicity. This class is consists of Tiles of BufferdImage and the 
// KrusPanel class is at the array position [2][2]. It is the KrusPanel class that i want to rotate.


public class SeePanel extends JPanel{

      private static KrusPanel crossing;



      private void initializeComponents(){

   timer = new javax.swing.Timer(70, new MoveListener());
   this.crossing = new CrossingPanel(261,261);
  }






    public SeePanel(){ 
  this.initializeComponents();

     }


     public void paintComponent(Graphics comp){
   super.paintComponent(comp); 
  comp2D = (Graphics2D)comp;
  BasicStroke pen = new BasicStroke(15.0F, BasicStroke.CAP_BUTT,BasicStroke.JOIN_ROUND);
     comp2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                             RenderingHints.VALUE_ANTIALIAS_ON);
     comp2D.setPaint(Color.red);
     comp2D.setBackground(Color.WHITE);
     comp2D.drawImage(img, 0, 0, null);
     comp2D.draw(this.horizontalRail); 
     this.crossing.paintComponent(comp2D); 
     this.rob.drawRobot(comp2D);

 }


  public static void rotateCrossing(){

   this.crossing.getTimer().start();
   repaint();


// i tried below code also it didn't work. so i put them in comments
    /*
   Runnable rotateCrossing1 = new Runnable(){  // to be removed
         public void run() {
        crossing.getTimer().start();
       }
      };
      SwingUtilities.invokeLater(rotateCrossing1);
    */

  }

}





// MAIN CLASS
// This is the GUI class which consists of buttons and others

public class MainAPP{

   SeePanel = new SeePanel();
  // Buttons declarations here and others

public MainAPP(){
  // all listener registers here
}


// Here i call the rotateCrossing() of the SeePanel class but it is not working as i want.
 // I would like to see the image rotating gradually till it stops but it doesn't. 
//This it what it does. After i click the button, i don't see it rotating. But when i minimize and maximize the main window,
// i see the image  just rotate(flip) fast like that.

public void actionPerformed(ActionEvent e){

    SeePanel.rotateCrossing();                  
}


    public static main(string[] str){

    }


}

Please do help me to fix it.

thanks

A: 

It seems like it should work fine. I cleaned up your code a bit and it worked fine for me:

public class KrusPanel extends JPanel {
private Image crossingImage;
private int currentRotationAngle;
private AffineTransform affineTransform;
private static int ROTATE_ANGLE_OFFSET = 2;

private int xCoordinate;
private int yCoordinate;

private Timer timer;

private void initialize() {

    crossingImage = Toolkit.getDefaultToolkit().getImage("images/railCrossing3.jpg");
    crossingImage.getWidth(this);
    crossingImage.getHeight(this);
    affineTransform = new AffineTransform();
    currentRotationAngle = 90;
    timer = new Timer(20, new MoveListener());

    addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            start();
        }
    });

}

public KrusPanel(int x, int y) {

    xCoordinate = x;
    yCoordinate = y;
    setPreferredSize(new Dimension(50, 50));
    setBackground(Color.red);
    setLayout(new FlowLayout());
    initialize();
}

@Override
public void paintComponent(Graphics grp) {

    Graphics2D g2d = (Graphics2D) grp;
    g2d.setColor(Color.BLACK);
    affineTransform = AffineTransform.getTranslateInstance(xCoordinate, yCoordinate);

    affineTransform.rotate(Math.toRadians(currentRotationAngle), crossingImage.getWidth(this) / 2, crossingImage.getHeight(this) / 2);

    g2d.drawImage(crossingImage, affineTransform, this);
}

public void rotateCrossing() {

    currentRotationAngle += ROTATE_ANGLE_OFFSET;

    if (currentRotationAngle % 90 == 0) {
        timer.stop();
    }

    repaint();
}

private class MoveListener implements ActionListener {

    public void actionPerformed(ActionEvent e) {

        rotateCrossing();
        // repaint();

    }

}

void start() {
    if (timer != null) {
        timer.start();
    }
}

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setSize(320, 240);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.add(new KrusPanel(50, 50));

    frame.setVisible(true);
}
}

I click the image and it rotates 90 degrees each time.

j flemm
A: 

Please thank you soo much for your answer i appreciate it alot. Thank you again. I have a little problem and may be you can help. The problem is this:

In my project, the image to be rotated is a separate class extended from JPanel as you did. Then in another class i have a buffered image of 9 Tiles (3 rows and 3 columns). In this buffered image, i place the image (to be rotated) on position [2][2]. So this BufferedImage(including the to be rotated image) is in the top part of the main frame of the window. Then there is a button in another panel which i place in the bottom part of the main window.

So now the bufferedimage in another panel, the button to be clicked in another panel. Now i need a way so that when i click the button, then the image can rotate. But when i click it, it doesn't rotate.

Your example is perfect but they are all in the same panel(class). I need two different class (one for the bufferedimage and one for the button).I want the image to be in different panel and a button in another panel.

If you can help me, then i will be very happy, because i have spent hours upon hours, but it is not working.

Thanks for your help.

kap