以特定模式动画矩形

Animating a Rectangle in a specific pattern

我想以特定模式为矩形设置动画。有人告诉我使用 SwingTimer 代替 Thread.

作为动画

我的计划是制作一个向前移动的矩形动画,直到它到达帧的末尾。然后它向下移动一个单位(矩形的高度,所以在我的例子中是 30),然后向后移动;当它到达尽头时,它会再次向下移动,依此类推。

现在 SwingTimer 的问题是整个操作是一个连续的循环,因此矩形不会按照我想要的方式移动。为了让它工作,我想我必须开始和停止一些复杂的方法的循环,我不知道如何正确地做。

那么我怎样才能按照我想要的方式为矩形设置动画呢? SwingTimer 真的是做这些事情的正确方法还是其他方法更好?

这是我目前得到的代码。我知道这并不多,而且 ActionPerformed 制作完全不同的动画。

import javax.swing.JFrame;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;


    public class Test extends javax.swing.JPanel implements ActionListener{
    
        private int x = 0;
        private int y = 0;
        Timer tm = new Timer(50, this);
    
        public Test() {
            initComponents();
        }
    
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(new java.awt.Color(102, 102, 102));
            g.fillRect(x, y, 30, 30);
            tm.start();
        }
    
        public void moveForward() {
            x = x + 30;
            repaint();
            System.out.println("(" + x + "|" + y + ")");
        }
    
        public void moveBackwards() {
            x = x - 30;
            repaint();
            System.out.println("(" + x + "|" + y + ")");
        }
    
        public void moveDown() {
            y = y + 30;
            repaint();
            System.out.println("(" + x + "|" + y + ")");
        }
    
        public void moveUp() {
            y = y - 30;
            repaint();
            System.out.println("(" + x + "|" + y + ")");
        }
    
        public void actionPerformed(ActionEvent e) {
           moveForward();
           if (x >= 270){
               moveDown();
              }
            }
        
        public static void main(String[] args) {
            Test t = new Test();
            JFrame f = new JFrame();
            f.setSize(300, 300);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(t);
            f.setVisible(true);
        }

到目前为止你所做的看起来很不错。您只需要您的操作方法即可正常工作。为此,我会使用一个名为 direction:

的 class 变量
private boolean direction = true;

现在,在您的操作方法中,您可以根据方向向前或向后移动矩形。如果它到达终点,则向下移动矩形并反转方向:

public void actionPerformed(ActionEvent e) {
    
    if (direction){
        moveForward();
    }
    else {
        moveBackwards();
    }

    //Check if it is at the end
    if(((x >= 270) && (direction)) || ((x <= 30) && (!direction))) {
        moveDown();
        direction = !direction;
    }
}

if 子句有点复杂,但如果您想让它更具可读性,您可以将其拆分。