首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Graphics2D旋转

用Graphics2D旋转
EN

Stack Overflow用户
提问于 2014-01-17 09:10:05
回答 2查看 930关注 0票数 0

我目前正在试验Graphics2D和KeyListener,我目前正在测试旋转物体(在这里是五角大楼)。现在,它工作在旋转的意义上,除了每次按压VK_RIGHT或VK_LEFT时,它应该按1弧度旋转。

但是,目前它只对第一个键按下这样做。从那时起,它创造了一个模式旋转它的1,2,3,4,5.等等,每次弧度(第9键按弧度旋转),而不是每个按键只有1弧度。

创建JFrame:

代码语言:javascript
复制
import javax.swing.JFrame;


    public class Main {

        public Main() {
            JFrame window = new JFrame("Rotating Hexagons");
            window.setSize(800,600);
            window.setLocationRelativeTo(null);
            window.setResizable(false);
            window.setContentPane(new RotatingHexagon());
            window.pack();
            window.setVisible(true);
        }

        public static void main(String[]args) {
            new Main();
        }

    }

RotatingHexagon类:

代码语言:javascript
复制
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;


public class RotatingHexagon extends JPanel implements KeyListener {

    private Polygon poly;

    private int[] xpoints = { 0, -10, -7, 7, 10 };
    private int[] ypoints = { -10, -2, 10, 10, -2 };

    private int rotation = 0;

    public RotatingHexagon() {
        setPreferredSize(new Dimension(800,600));
        setFocusable(true);
        requestFocus();
    }

    public void init() {
        poly = new Polygon(xpoints, ypoints, xpoints.length);

        addKeyListener(this);
    }

    public void paint(Graphics g) {
        init();

        Graphics2D g2d = (Graphics2D) g;

        int width = getSize().width;
        int height = getSize().height;

        g2d.setColor(Color.BLACK);
        g2d.fillRect(0, 0, width, height);

        g2d.setColor(Color.WHITE);
        g2d.drawString(rotation + " radians", 10, 20);

        g2d.translate(width / 2, height / 2);
        g2d.scale(20, 20);
        g2d.rotate(Math.toRadians(rotation));

        g2d.setColor(new Color(255, 100, 100));
        g2d.fill(poly);
        g2d.setColor(Color.WHITE);
        g2d.draw(poly);
    }

    public void keyPressed(KeyEvent k) {
        switch(k.getKeyCode()) {
        case KeyEvent.VK_LEFT:
            rotation--;
            if (rotation < 0) rotation = 359;
            repaint();
            break;
        case KeyEvent.VK_RIGHT:
            rotation++;
            if (rotation > 360) rotation = 0;
            repaint();
            break;
        }
    }

    public void keyReleased(KeyEvent k) {}
    public void keyTyped(KeyEvent k) {}

}

我真的不知道为什么它不是每次只旋转1弧度,所以任何帮助都是非常感谢的。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-17 09:27:27

原因是一次又一次地调用paint()方法中的init()函数。因此,KeyListener被多次添加,导致它被多次调用,每次按键时都会增加计数器的增量。

将其移动到构造函数:

代码语言:javascript
复制
public RotatingHexagon() {
    setPreferredSize(new Dimension(800,600));
    setFocusable(true);
    requestFocus();
    addKeyListener(this);
}

public void init() {
    poly = new Polygon(xpoints, ypoints, xpoints.length);        
}

安迪

票数 1
EN

Stack Overflow用户

发布于 2014-01-17 09:33:18

您应该使用持久的AffineTransform来进行旋转。他们要强大得多。

我还在代码中看到了几个问题,您正在每帧调用init方法--这可能是每秒60次。在这个过程中,您将在每个帧中添加一个新的键侦听器。您也正在创建一个新的多边形,这将减慢性能。

我对您的代码做了一些更改,并以AffineTransforms为例。看看这个是否有帮助。

代码语言:javascript
复制
package com.joey.testing;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.AffineTransform;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class AffineTransformTest extends JPanel implements KeyListener {

    private Polygon poly;

    private int[] xpoints = { 0, -10, -7, 7, 10 };
    private int[] ypoints = { -10, -2, 10, 10, -2 };

    private int rotation = 0;
    AffineTransform transform;
    AffineTransform rotationTransform;
    AffineTransform translateTransform;

    public AffineTransformTest() {
        setPreferredSize(new Dimension(800,600));
        setFocusable(true);
        requestFocus();

        //Do Init here - no point in creating new polygon each frame.
        //It also adds the key listener each time
        init();
        updateTransforms();
    }

    public void init() {
        poly = new Polygon(xpoints, ypoints, xpoints.length);
        transform = new AffineTransform();
        rotationTransform = new AffineTransform();
        translateTransform = new AffineTransform();
        addKeyListener(this);
    }

    //Use Paint Compoent
    @Override
    public void paintComponent(Graphics g) {
        //Always call super to clear the screen
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        int width = getSize().width;
        int height = getSize().height;

        g2d.setColor(Color.BLACK);
        g2d.fillRect(0, 0, width, height);

        g2d.setColor(Color.WHITE);
        g2d.drawString(rotation + " radians", 10, 20);


        //Store old transform so we can apply it
        AffineTransform old = g2d.getTransform();
        //Add Transform and move polygon
        g2d.setTransform(transform);
        g2d.setColor(new Color(255, 100, 100));
        g2d.fill(poly);
        g2d.setColor(Color.WHITE);
        g2d.draw(poly);
        g2d.setTransform(old);
    }

    public void keyPressed(KeyEvent k) {
        switch(k.getKeyCode()) {
        case KeyEvent.VK_LEFT:
            rotation--;
            if (rotation < 0) rotation = 359;
            repaint();
            break;
        case KeyEvent.VK_RIGHT:
            rotation++;
            if (rotation > 360) rotation = 0;
            repaint();
            break;
        }
        updateTransforms();
    }

    public void updateTransforms(){
        //Resets transform to rotation
        rotationTransform.setToRotation(Math.toRadians(rotation));
        translateTransform.setToTranslation(getWidth()/2, getHeight()/2);

        //Chain the transforms (Note order matters)
        transform.setToIdentity();
        transform.concatenate(translateTransform);
        transform.concatenate(rotationTransform);
    }

    public void keyReleased(KeyEvent k) {}
    public void keyTyped(KeyEvent k) {}


    public static void main(String input[]){
        JFrame f= new JFrame("AffineTransform");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(100, 100);
        f.setResizable(true);
        f.getContentPane().setLayout(new BorderLayout());
        f.getContentPane().add(new AffineTransformTest());
        f.show();

    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21181840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档