У меня есть следующий класс, который поворачивает изображение, когда я даю ему градусы, которые он должен вращать, но он не работает так, как я хочу. Проблема в том, что, например, если я поворачиваю на 90 градусов, переменная currentRotationAngle внутри rotateCrossing () постепенно устанавливается равной 90 после поворота. Это происходит потому, что я всегда увеличиваю эту переменную на offset (10).
В следующий раз, когда я захочу повернуть на 180 градусов, потому что переменная уже равна 90, она поворачивает только на 90 (90 + 90 = 180) вместо целых 180 градусов. Я попытался исправить это, установив «currentRotationAngle» на 0 в методе «stop ()» каждый раз, когда вращение завершается, но оно позволяет вращению вернуться в исходное положение.
Это то, что я хочу, когда я даю ему градусы, я хочу, чтобы он поворачивался точно на эти градусы, начиная с последней позиции вращения. Пожалуйста, следующий класс.
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;
}
}
Я бы хотел, чтобы кто-нибудь помог мне исправить это.
Спасибо, ребята.