2010-07-30 79 views
1

我需要你的幫助。我花了數小時試圖解決它,但沒有工作。需要幫助解決旋轉圖像問題

我有一個圖像旋轉時,用戶點擊一個按鈕。但它不起作用。

我想看到圖像逐漸旋轉直到停止,但它不。 這就是它所做的。當我點擊按鈕後,我看不到它旋轉。但是,當我最大限度地減少和最大化主窗口, 我看到圖像旋轉(翻轉)像這樣快。它做旋轉,但我沒有看到它,因爲它正在做。在最小化和最大化主窗口後,它會在一秒鐘內旋轉。

我試圖解決更新GUI時的問題,因爲它在旋轉,但我不知道如何解決它。

這些是代碼。請將我的代碼輕鬆整理以便閱讀。

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

    } 


} 

請幫我解決它。

謝謝

回答

0

它似乎應該很好。我清理你的代碼了一下,它爲我工作得很好:

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

我點擊圖像,並將其旋轉,每次90度。