旋转Ellipse2D对象

时间:2015-05-20 18:36:35

标签: java user-interface keyboard shape

我试图根据用户键输入旋转一个完整的Ellipse2D对象。如果用户按下右键,则向右和向左旋转键表示向左旋转。 rotAngle设置为25.我创建了一个单独的drawRotEllipse,否则它将始终绘制原始的。我认为我的混乱是图形和形状对象发生的。尝试了AffineTransform业务,但这也没有成功。我只想让它围绕中心旋转。谢谢你的帮助!

class Canvas extends JPanel implements java.io.Serializable{
        int x1 = (int) (this.getWidth()/2)+100;
        int y1 = (int) (this.getHeight()/2)+20;
        int x2 = (int) this.getWidth()+100;
        int y2 = (int) this.getHeight()+200;

        @Override
        public void paintComponent(Graphics g){
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, this.getWidth(), this.getHeight());
            g.setColor(Color.RED);
            drawEllipse(g);
        }

        public void drawEllipse (Graphics g){
            Graphics2D g2d = (Graphics2D) g;
            myShape = new Ellipse2D.Double(x1,y1,x2,y2);
            g2d.draw(myShape);
            this.repaint();
        }

        public void drawRotEllipse (Graphics g){
            g2d.draw(myShape);
            this.repaint();
        }
    }


 private void jPanel1KeyPressed(java.awt.event.KeyEvent evt) {                                   
        if (evt.getKeyCode()==39){
            g2d.rotate(Math.toDegrees(rotAngle));
            myCanvas.drawRotEllipse(g2d);
        }
        else if (evt.getKeyCode()==37){
            g2d.rotate(Math.toDegrees(-rotAngle));
            myCanvas.drawRotEllipse(g2d);
        }
    } 

1 个答案:

答案 0 :(得分:0)

if (evt.getKeyCode()==39)

不要使用魔法数字。人们只是通过查看代码就不知道这意味着什么。

而是使用API​​提供的变量:

if (evt.getKeyCode() == KeyEvent.VK_RIGHT)

你的KeyEvent代码不应该做实际的绘画。所有代码应该做的是设置"度"你班上的财产。然后setDegrees(...)方法将负责调用repaint()。现在每当重新绘制组件时,形状将以其当前旋转角度绘制。

这是一个使用JSlider来更改类的旋转度的示例。

旋转图像。您应该能够将图像的代码旋转更改为仅绘制您的形状:

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.event.*;

public class Rotation2 extends JPanel
{
    BufferedImage image;
    int degrees;
    int point = 250;

    public Rotation2(BufferedImage image)
    {
        this.image = image;
        setDegrees( 0 );
        setPreferredSize( new Dimension(600, 600) );
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        Graphics2D g2 = (Graphics2D)g.create();

        double radians = Math.toRadians( degrees );
        g2.translate(point, point);
        g2.rotate(radians);
        g2.translate(-image.getWidth(this) / 2, -image.getHeight(this) / 2);
        g2.drawImage(image, 0, 0, null);

        g2.dispose();

        g.setColor(Color.RED);
        g.fillOval(point - 5, point - 5, 10, 10);
    }

    public void setDegrees(int degrees)
    {
        this.degrees = degrees;
        repaint();
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
//                  String path = "mong.jpg";
                    String path = "dukewavered.gif";
                    ClassLoader cl = Rotation2.class.getClassLoader();
                    BufferedImage bi = ImageIO.read(cl.getResourceAsStream(path));
                    final Rotation2 r = new Rotation2(bi);

                    final JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 360, 0);
                    slider.addChangeListener(new ChangeListener()
                    {
                        public void stateChanged(ChangeEvent e)
                        {
                            int value = slider.getValue();
                            r.setDegrees( value );
                        }
                    });

                    JFrame f = new JFrame();
                    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    f.add(new JScrollPane(r));
                    f.add(slider, BorderLayout.SOUTH);
                    f.pack();
                    f.setLocationRelativeTo(null);
                    f.setVisible(true);
                }
                catch(IOException e)
                {
                    System.out.println(e);
                }
            }
        });
    }
}