我正在寻找一个答案,当我按下一个键时三角形不旋转的原因。
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()
无法正常工作还是其他什么?
答案 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:
好的,这对我有用:
transform(AffineTransform at)
和AffineTransform.getTranslateInstance(tx,ty)将您的三角形居中放在JPanel上。 star.transform(AffineTransform at)
,但这次使用的AffineTransform.getRotateInstance(BASE_THETA, anchorx, anchory)
需要3个双打,因此您可以告诉它旋转多远并围绕您的恒星旋转中心轴形状。