【问题标题】:rotate an Ellipse2D object旋转 Ellipse2D 对象
【发布时间】:2015-08-02 04:21:35
【问题描述】:

我正在尝试根据用户键输入来旋转整个 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);
        }
    } 

【问题讨论】:

    标签: java user-interface keyboard shape


    【解决方案1】:
    if (evt.getKeyCode()==39)
    

    不要使用幻数。人们不知道这意味着只看代码。

    改为使用 API 提供的变量:

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

    您的 KeyEvent 代码不应该进行实际的绘制。代码应该做的就是设置你的类的“degrees”属性。然后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);
                    }
                }
            });
        }
    }
    

    【讨论】:

    • 我正在使用 Netbeans gui builder,因此已经为我生成了一些代码。您的答案与我的代码完全不同,并且突然使用文件和图像。我没有使用 Jslider。
    • 我已经说过代码不同了。代码的重点是向您展示setting the degrees 的概念,并在绘画方法中使用该属性。无论您是使用滑块设置度数还是使用按钮设置度数都无关紧要。概念是一样的。我不会为你编写代码。从此处介绍的概念中学习并修改您的代码。从此处的代码开始,进行简单的更改以旋转形状。然后用按钮替换滑块。
    猜你喜欢
    • 2021-09-13
    • 2013-04-22
    • 2014-12-28
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    相关资源
    最近更新 更多