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