猿问

如何在摆动中逐渐旋转图像?

如何在摆动中逐渐旋转图像?

当用户单击按钮时,我有一个正在旋转的图像。但这是行不通的。

我想看到图像逐渐旋转到90度,直到它停止,但它没有。当点击按钮时,图像必须逐渐旋转90度。

我创建了一个SSCCE来演示这个问题。请替换CrossingPanelSSCE使用您选择的任何图像初始化。把图像放进你的images文件夹并命名为images/railCrossing.JPG.

RotateButtonSSCE

import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.Action;import javax.swing.BorderFactory;
import javax.swing.JButton;import javax.swing.JPanel;public class RotateButtonSSCE extends JPanel implements ActionListener{
      private JButton rotate = new JButton("Rotate");
      private VisualizationPanelSSCE vis = new VisualizationPanelSSCE();

    public RotateButtonSSCE() {
        this.setBorder(BorderFactory.createTitledBorder("Rotate Button "));
        this.rotate.addActionListener(this);
        this.add(rotate);
    }

    public void actionPerformed(ActionEvent ev) {
        vis.rotatetheCrossing();
    }}
慕村225694
浏览 429回答 3
3回答

森林海

除了@tulskiy的有益观察之外,我还要补充两点:始终在事件调度线程见下文。阿沙司应该是简短、独立、正确(可编译),示例..为了方便起见,不需要其他人重新创建多个公共类;使用顶级(包私有)或嵌套类。由于这是一个图形问题,使用一个公共的或合成的图像,以反映您的问题。在下面的例子中,paintComponent()改变图形上下文的转换以影响旋转。注意,这些操作是以声明顺序(明显)相反的方式执行的:首先,图像的中心被转换为原点;第二,图像被旋转;第三,图像的中心被转换到面板的中心。通过调整面板大小可以看到效果。增编:另见本备选案文进场使用AffineTransform.package&nbsp;overflow;import&nbsp;java.awt.*;import&nbsp;java.awt.event.*;import&nbsp;java.awt.image.BufferedImage;import&nbsp;java.util.Random; import&nbsp;javax.swing.*;/** &nbsp;*&nbsp;@see&nbsp;https://stackoverflow.com/questions/3371227 &nbsp;*&nbsp;@see&nbsp;https://stackoverflow.com/questions/3405799 &nbsp;*/public&nbsp;class&nbsp;RotateApp&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;int&nbsp;N&nbsp;=&nbsp;3; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EventQueue.invokeLater(new&nbsp;Runnable()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;run()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JFrame&nbsp;frame&nbsp;=&nbsp;new&nbsp;JFrame(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.setLayout(new&nbsp;GridLayout(N,&nbsp;N,&nbsp;N,&nbsp;N)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;N&nbsp;*&nbsp;N;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.add(new&nbsp;RotatePanel()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.pack(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.setVisible(true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;}}class&nbsp;RotatePanel&nbsp;extends&nbsp;JPanel&nbsp;implements&nbsp;ActionListener&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;int&nbsp;SIZE&nbsp;=&nbsp;256; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;double&nbsp;DELTA_THETA&nbsp;=&nbsp;Math.PI&nbsp;/&nbsp;90; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;Timer&nbsp;timer&nbsp;=&nbsp;new&nbsp;Timer(25,&nbsp;this); &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Image&nbsp;image&nbsp;=&nbsp;RotatableImage.getImage(SIZE); &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;double&nbsp;dt&nbsp;=&nbsp;DELTA_THETA; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;double&nbsp;theta; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;RotatePanel()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.setBackground(Color.lightGray); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.setPreferredSize(new&nbsp;Dimension( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image.getWidth(null),&nbsp;image.getHeight(null))); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.addMouseListener(new&nbsp;MouseAdapter()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;mousePressed(MouseEvent&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image&nbsp;=&nbsp;RotatableImage.getImage(SIZE); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dt&nbsp;=&nbsp;-dt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer.start(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;paintComponent(Graphics&nbsp;g)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.paintComponent(g); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Graphics2D&nbsp;g2d&nbsp;=&nbsp;(Graphics2D)&nbsp;g; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2d.translate(this.getWidth()&nbsp;/&nbsp;2,&nbsp;this.getHeight()&nbsp;/&nbsp;2); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2d.rotate(theta); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2d.translate(-image.getWidth(this)&nbsp;/&nbsp;2,&nbsp;-image.getHeight(this)&nbsp;/&nbsp;2); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2d.drawImage(image,&nbsp;0,&nbsp;0,&nbsp;null); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;actionPerformed(ActionEvent&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;theta&nbsp;+=&nbsp;dt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repaint(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Dimension&nbsp;getPreferredSize()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;Dimension(SIZE,&nbsp;SIZE); &nbsp;&nbsp;&nbsp;&nbsp;}}class&nbsp;RotatableImage&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;Random&nbsp;r&nbsp;=&nbsp;new&nbsp;Random(); &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;public&nbsp;Image&nbsp;getImage(int&nbsp;size)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedImage&nbsp;bi&nbsp;=&nbsp;new&nbsp;BufferedImage( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size,&nbsp;size,&nbsp;BufferedImage.TYPE_INT_ARGB); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Graphics2D&nbsp;g2d&nbsp;=&nbsp;bi.createGraphics(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2d.setRenderingHint( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RenderingHints.KEY_ANTIALIASING, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RenderingHints.VALUE_ANTIALIAS_ON); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2d.setPaint(Color.getHSBColor(r.nextFloat(),&nbsp;1,&nbsp;1)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2d.setStroke(new&nbsp;BasicStroke(size&nbsp;/&nbsp;8)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2d.drawLine(0,&nbsp;size&nbsp;/&nbsp;2,&nbsp;size,&nbsp;size&nbsp;/&nbsp;2); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2d.drawLine(size&nbsp;/&nbsp;2,&nbsp;0,&nbsp;size&nbsp;/&nbsp;2,&nbsp;size); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2d.dispose(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;bi; &nbsp;&nbsp;&nbsp;&nbsp;}}

米琪卡哇伊

密码旋转图标使用仿射变换围绕其中心旋转。
随时随地看视频慕课网APP

相关分类

Java
我要回答