【问题标题】:Need Help In Solving Rotation Image Problem需要帮助解决旋转图像问题
【发布时间】:2010-07-30 12:05:47
【问题描述】:

我需要你的帮助。我花了几个小时试图解决它但没有工作。

当用户单击按钮时,我正在旋转的图像。但它不起作用。

我希望看到图像逐渐旋转直到它停止,但它没有。 这就是它的作用。单击按钮后,我看不到它旋转。但是当我最小化和最大化主窗口时, 我看到图像只是像那样快速旋转(翻转)。它会旋转,但我看不到它正在做的事情。它只是在最小化和最大化主窗口后在一秒钟内旋转。

我认为这个问题涉及在 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){

    }


}

请帮我解决它。

谢谢

【问题讨论】:

    标签: java rotation bufferedimage


    【解决方案1】:

    看起来它应该可以正常工作。我清理了你的代码,对我来说效果很好:

    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 度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多