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){
}
}
請幫我解決它。
謝謝