我有以下类旋转图像,当我给它的度数,它必须旋转,但它不工作,因为我想要的。问题是这样的,例如,如果我旋转90度,rotationCrossing()内的变量“currentRotationAngle”在旋转后逐渐设置为90。发生这种情况是因为我总是通过偏移量(10)增加该变量。旋转不工作,因为我想
下一次我想旋转180度,因为变量已经是90,它只旋转另一个90(90 + 90 = 180)而不是整个180度。我试图通过在旋转结束后在“stop()”方法中将“currentRotationAngle”设置为0来修复它,但它让旋转回到其起始位置。
这就是我想要的,当我给它度数时,我希望它完全旋转到从最后一个旋转位置开始的那个度数。请以下是班级。
public class CrossingPanel extends JPanel{
private static final long serialVersionUID = 1L;
// private data members
private Image crossingImage;
private int currentRotationAngle;
private int imageWidth;
private int imageHeight;
private AffineTransform affineTransform;
private boolean clockwise;
private static int ROTATE_ANGLE_OFFSET = 10;
private boolean finishRotation = false;
private int degreesToTurn;
private static int LENGTH = 75;
private static int RAIL_LENGTH = 130;
private int ARROWLENGTH = 4;
private static int TICKSIZE = 10;
private GeneralPath path;
private int xCoordinate;
private int yCoordinate;
private javax.swing.Timer timer;
private void initialize(){
//this.crossingImage = getImage("images/railCrossing.JPG");
this.crossingImage = Toolkit.getDefaultToolkit().getImage("images/crossingsHorizontal.JPG");
// MediaTracker mt = new MediaTracker(this);
// mt.addImage(this.crossingImage, 1);
this.path = new GeneralPath();
this.imageWidth = this.getCrossingImage().getWidth(this);
this.imageHeight = this.getCrossingImage().getHeight(this);
this.affineTransform = new AffineTransform();
this.setCurrentRotationAngle(0);
this.setDegreesToTurn(0);
timer = new javax.swing.Timer(20, new MoveListener());
// timer.start();
}
public CrossingPanel(int x, int y/*, BufferedImage img*/) {
this.setxCoordinate(x);
this.setyCoordinate(y);
this.setPreferredSize(new Dimension(50, 50));
this.setBackground(Color.red);
TitledBorder border = BorderFactory.createTitledBorder("image");
//this.setBorder(border);
this.setLayout(new FlowLayout());
this.initialize();
}
public GeneralPath getPath() {
return path;
}
public void setPath(GeneralPath path) {
this.path = path;
}
private void constructInterfaceComponents(){
}
private Shape createVerticalRail(){
//System.out.print("dddd: " + this.LENGTH + "\n");
this.getPath().moveTo(0, LENGTH);
this.getPath().lineTo(RAIL_LENGTH,75);
float cm = 72/2.54f;
float lengthCentimeter = RAIL_LENGTH;
for (float i = 260.0f, j = 340; i >= 0; i -= 15.0f, j += 20) {
float tick = i * cm;
// path.moveTo(340, i);
// path.lineTo(360, i);
}
this.getPath().closePath();
return this.getPath();
}
public void paintComponent(Graphics grp){
Rectangle rect = this.getBounds();
Graphics2D g2d = (Graphics2D)grp;
//set the background color to black
g2d.setColor(Color.BLACK);
// g2d.draw(this.createVerticalRail());
//set the translation to the mid of the component
this.getAffineTransform().setToTranslation(this.getxCoordinate(), this.getyCoordinate());
//rotate with the rotation point as the mid of the image
this.getAffineTransform().rotate(Math.toRadians(this.getCurrentRotationAngle()), this.getCrossingImage().getWidth(this) /2,
this.getCrossingImage().getHeight(this)/2);
//draw the image using the AffineTransform
g2d.drawImage(this.getCrossingImage(), this.getAffineTransform(), this);
}
public void rotateCrossing(int degrees){
// this condition is there to avoid division of zero
// and also there is no need to rotate 0 degrees
if(degrees == 0){
this.stop();
return;
}
currentRotationAngle += ROTATE_ANGLE_OFFSET;
if (currentRotationAngle % degrees == 0) {
timer.stop();
this.finishRotation = true;
}
repaint();
}
public int getDegreesToTurn() {
return degreesToTurn;
}
public void setDegreesToTurn(int degreesToTurn) {
this.degreesToTurn = degreesToTurn;
}
private class MoveListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
rotateCrossing(degreesToTurn);
}
}
void start(int degreesToTurn) {
if (timer != null) {
timer.start();
}
this.setDegreesToTurn(degreesToTurn);
}
void stop() {
timer.stop();
this.setCurrentRotationAngle(0);
}
public Image getCrossingImage() {
return crossingImage;
}
public void setCrossingImage(Image crossingImage) {
this.crossingImage = crossingImage;
}
public int getCurrentRotationAngle() {
return currentRotationAngle;
}
public void setCurrentRotationAngle(int currentRotationAngle) {
this.currentRotationAngle = currentRotationAngle;
}
public int getImageWidth() {
return imageWidth;
}
public void setImageWidth(int imageWidth) {
this.imageWidth = imageWidth;
}
public int getImageHeight() {
return imageHeight;
}
public void setImageHeight(int imageHeight) {
this.imageHeight = imageHeight;
}
public AffineTransform getAffineTransform() {
return affineTransform;
}
public void setAffineTransform(AffineTransform affineTransform) {
this.affineTransform = affineTransform;
}
public boolean isClockwise() {
return clockwise;
}
public void setClockwise(boolean clockwise) {
this.clockwise = clockwise;
}
public int getxCoordinate() {
return xCoordinate;
}
public void setxCoordinate(int xCoordinate) {
this.xCoordinate = xCoordinate;
}
public int getyCoordinate() {
return yCoordinate;
}
public void setyCoordinate(int yCoordinate) {
this.yCoordinate = yCoordinate;
}
public javax.swing.Timer getTimer() {
return timer;
}
public void setTimer(javax.swing.Timer timer) {
this.timer = timer;
}
public boolean isFinishRotation() {
return finishRotation;
}
public void setFinishRotation(boolean finishRotation) {
this.finishRotation = finishRotation;
}
}
我想某人帮我修复它。
谢谢你们。
请我加入了“旋转”的标签,因为我真正关心的不是处理旋转图像旋转。我在问你是否可以再次添加“旋转”标签。谢谢 – kap 2010-08-12 21:42:24