我需要你的帮助。我花了几个小时试图解决它但没有工作。
当用户单击按钮时,我有一个正在旋转的图像。但它不起作用。
我想看到图像逐渐旋转直到它停止,但它没有。这就是它的作用。单击按钮后,我看不到它旋转。但是当我最小化和最大化主窗口时,我看到图像只是像那样快速旋转(翻转)。它会旋转,但我看不到它正在做的事情。它只是在最小化和最大化主窗口后在一秒钟内旋转。
我认为问题涉及在旋转时更新 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){
}
}
请帮我解决它。
谢谢