2010-07-30 10 views
1

J'ai besoin de votre aide s'il vous plaît. J'ai passé des heures à essayer de le résoudre mais je ne travaillais pas.Besoin d'aide pour résoudre l'image de rotation problème

J'ai une image que je suis en train de tourner lorsque l'utilisateur clique sur un bouton. Mais ça ne fonctionne pas.

J'aimerais voir l'image tourner graduellement jusqu'à ce qu'elle s'arrête, mais ce n'est pas le cas. Voilà ce qu'il fait. Après avoir cliqué sur le bouton, je ne le vois pas tourner. Mais quand je minimise et maximise la fenêtre principale, je vois l'image juste tourner (flip) rapide comme ça. Il fait la rotation mais je ne la vois pas comme elle le fait. Il suffit de tourner dans une seconde après minimiser et maximiser la fenêtre principale.

Je pense que le problème concerne la mise à jour de l'interface graphique car elle tourne mais je ne sais pas comment la réparer.

Voici le code. S'il vous plaît j'ai coupé le code pour une lecture facile.

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){ 

    } 


} 

S'il vous plaît faites-moi aider à le réparer.

merci

Répondre

0

Il semble que cela devrait fonctionner correctement. Je nettoyais votre code un peu et il a bien fonctionné pour moi:

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); 
} 
} 

je clique sur l'image et il pivote de 90 degrés à chaque fois.