用鼠标旋转的矩形不均匀

问题描述 投票:1回答:1

下面的示例绘制2个矩形。

在paintComponent()方法中,正常绘制第一个Rectangle,然后旋转第二个Rectangle。

旋转是基于鼠标的移动。如果在矩形上单击鼠标然后移动以圆形方式,第2个Rectangle会按预期旋转,但是随着鼠标的旋转,Rectangle的旋转并不总是与鼠标同步。

我怀疑这都与角度计算有关。关于如何使Rectangle的旋转与鼠标移动同步的任何建议?

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.AffineTransform;
import java.util.Vector;

import javax.swing.JComponent;
import javax.swing.JFrame;


public class SimpleTest extends JComponent 
{
    static int x = 200,y = 200 , width = 100 , height = 30;
    static Vector objectsToDraw = new Vector();
    static int mouseClickX, mouseClickY, mouseX, mouseY = 0;
    static double angle;

    public static void main(String[] args) 
    {
        //Create Frame
        JFrame window = new JFrame();

        //Attach Mouse Listeners.
        window.addMouseMotionListener(new MouseMotionListener()
        {
            @Override
            public void mouseMoved(MouseEvent e) {  }

            @Override
            public void mouseDragged(MouseEvent e) 
            {
//              System.out.println("Dragged");
                System.out.println("Dragged at X :" + e.getX() + "   Y : " + e.getY());
                calculateAngle(e.getX(), e.getY());
                mouseX = e.getX();
                mouseY = e.getY();
                window.repaint();
            }

        });

        window.addMouseListener(new MouseListener()
        {
            @Override
            public void mouseClicked(MouseEvent arg0) { }

            @Override
            public void mouseEntered(MouseEvent arg0) { }

            @Override
            public void mouseExited(MouseEvent arg0)  {  }

            @Override
            public void mousePressed(MouseEvent e) 
            {
                System.out.println("Pressed at X :" + e.getX() + "   Y : " + e.getY());
                mouseClickX = e.getX();
                mouseClickY = e.getY();
            }

            @Override
            public void mouseReleased(MouseEvent arg0) 
            {
                System.out.println("Released");
                mouseClickX = 0;
                mouseClickY = 0;
                window.repaint();
            }   

        });

        //show Window
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setBounds(30, 30, 800, 800);
        window.getContentPane().add(new SimpleTest());
        window.setVisible(true);

    }

    public static void calculateAngle (int x, int y) 
    {
        int deltaX = x - 250;//Rectangle Center X
        int deltaY = y - 200;//Rectangle Center Y
        angle = Math.toDegrees(Math.atan2(deltaY, deltaX));
        System.out.println("Angle = " + angle);
    }   

    @Override //Works
    public void paintComponent(Graphics g) 
    {
        System.out.println("paintComponent() - using angle : " + angle);
        Graphics2D g2d = (Graphics2D)g;
        AffineTransform old = g2d.getTransform();
        g.drawRect(x,  y,  width,  height);
        g2d.rotate(Math.toRadians(angle), 250, 215); 
        Rectangle rect2 = new Rectangle(200, 200, 100, 30);
        g.drawRect(x,  y,  width,  height);
        g2d.setTransform(old);
    }   
}
java swing rotation awt
1个回答
0
投票
错误组件中。不要将其添加到窗口中,而要添加到执行绘图的JComponent中。
© www.soinside.com 2019 - 2024. All rights reserved.