以特定模式动画矩形
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 子句有点复杂,但如果您想让它更具可读性,您可以将其拆分。
我想以特定模式为矩形设置动画。有人告诉我使用 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 子句有点复杂,但如果您想让它更具可读性,您可以将其拆分。