Нужна помощь в решении проблемы поворота изображения - PullRequest
1 голос
/ 30 июля 2010

Мне нужна ваша помощь, пожалуйста. Я часами пытался ее решить, но не работал.

У меня есть изображение, которое я вращаю, когда пользователь нажимает кнопку. Но это не работает.

Я хотел бы видеть изображение, вращающееся постепенно, пока оно не остановится, но это не так. Это то, что он делает. После того, как я нажму кнопку, я не вижу ее вращающейся. Но когда я сверну и разверну главное окно, Я вижу, что изображение просто вращается (переворачивается) так быстро. Это делает вращение, но я не вижу это, как это делает. Он просто вращается через секунду после сворачивания и разворачивания главного окна.

Я думаю, что проблема связана с обновлением графического интерфейса, поскольку он вращается, но я не знаю, как это исправить.

это код. Пожалуйста, я сократил код для удобства чтения.

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

    }


}

Пожалуйста, помогите мне исправить это.

спасибо

1 Ответ

0 голосов
/ 30 июля 2010

Кажется, все должно работать нормально. Я немного почистил твой код, и он отлично сработал:

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 градусов.

...