当我按一个键时,有关为什么三角形不旋转的任何建议?

时间:2011-10-15 22:11:30

标签: java swing repaint

我正在寻找一个答案,当我按下一个键时三角形不旋转的原因。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.GeneralPath;

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

public class Beta extends JPanel implements KeyListener
{
    private static final long serialVersionUID = 1L;
    private int LEFT = 0, RIGHT = 1;

    Beta()
    {
        addKeyListener(this);
    }

    public void paintComponent( Graphics g )
    {
        repaint(); // call superclass's paintComponent

三角形的点

        int[] xPoints = {-50, 0, 50};
        int[] yPoints = {0, -50, 0};

        Graphics2D g2d = ( Graphics2D ) g;
        GeneralPath star = new GeneralPath(); // create GeneralPath object

        // set the initial coordinate of the General Path
        star.moveTo(-50, 0);

        // create the star--this does not draw the star
        for ( int count = 1; count < xPoints.length; count++ )
          star.lineTo( xPoints[ count ], yPoints[ count ] );

        star.closePath(); // close the shape

        g2d.translate( getWidth()/2, getHeight()/2 ); // translate the origin to (150, 150)

        // rotate around origin and draw stars in random colors

旋转

        g2d.rotate( Math.PI / 40.0 );

        g2d.setColor(Color.RED);

        g2d.fill( star );
    }

@Override
public void keyTyped(KeyEvent e) {
    // TODO Auto-generated method stub

}

按键绘制

public void keyPressed(KeyEvent ke)
{
    switch(ke.getKeyCode())
    {   
        default: repaint();
    }
}

@Override
public void keyReleased(KeyEvent e) {
    // TODO Auto-generated method stub

}

    public static void main( String[] args )
    {
        JFrame frame = new JFrame( "Space Battle Beta" );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

            //add Panel to frame
        Beta shapes2JPanel = new Beta(); 
        frame.add( shapes2JPanel ); // add shapes2JPanel to frame
        frame.setBackground(Color.BLACK);
        frame.setSize( 315, 330 ); // set frame size
        frame.setVisible( true ); // display frame
    }
} // end class Shapes2JPanel

不能使三角形旋转。 repaint()无法正常工作还是其他什么?

2 个答案:

答案 0 :(得分:3)

repaint()不会调用超类的paint方法,它会调用这个类的一个。你应该super.paintComponent(g)来调用超类的paintComponent()而不是repaint()

答案 1 :(得分:3)

考虑使用AffineTransform进行旋转,并在Swing Timer中执行此操作。然后在paintComponent方法中使用它来旋转一个三角形Shape,它可以是你的GeneralPath对象(虽然我在类中声明了GeneralPath变量,而不是在paintComponent中)。

至于你要重画的电话:

public void paintComponent( Graphics g )
{
    repaint(); // call superclass's paintComponent

你明白这没有任何关系,如果Swing不够智能会导致无限递归并锁定你的程序。正如James所提到的,为此行为调用super的paintComponent方法。

编辑1:
此外,您可能希望使用Key Bindings而不是KeyListener,因为它是更高级别的构造,并且在焦点方面更灵活 - 只有正在被侦听的组件具有焦点时,KeyListener才会起作用如果设置正确,则不能使用键绑定。

编辑2:
好的,这对我有用:

  • 使星形成为Path2D变量并再次成为一个类字段,并使用int []数组为x和y值初始化它。
  • 创建一个Swing Timer变量,我称之为rotateTimer,并使其成为一个类字段
  • 使用Path2D方法transform(AffineTransform at)和AffineTransform.getTranslateInstance(tx,ty)将您的三角形居中放在JPanel上。
  • 使用两个键绑定绑定到KeyEvent.VK_R键。我会使用KeyStroke.getKeyStroke方法,该方法需要2个整数和一个布尔值来绑定按下的键和释放的键。
  • 在按下的按键的AbstractAction中(onKeyRelease为false),start()你的计时器
  • 在AbstractAction for key release(onKeyRelease为true)中,stop()你的计时器
  • 在Swing Timer中,ActionListener的actionPerformed方法再次调用star.transform(AffineTransform at),但这次使用的AffineTransform.getRotateInstance(BASE_THETA, anchorx, anchory)需要3个双打,因此您可以告诉它旋转多远并围绕您的恒星旋转中心轴形状。
  • 在paintComponent中,您需要做的就是将Graphics转换为Graphics2D,并使用Graphics2D对象设置RenderingHints,以便打开消除锯齿,设置星形颜色并绘制星形,就是这样。