我需要你的帮助。我花了好几个小时试图解决它但没有工作。
当用户点击按钮时,我有一个正在旋转的图像。但它没有用。
我希望看到图像逐渐旋转直到它停止但却没有。 这就是它的作用。点击按钮后,我看不到它在旋转。但是当我最小化并最大化主窗口时, 我看到图像像这样快速旋转(翻转)。它做旋转,但我没有看到它正在做。它只需在最小化并最大化主窗口后旋转一秒钟。
我认为问题涉及更新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 :(得分: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度。