Благодаря комментариям @Max я нашел решение моей собственной проблемы, создав внутренний класс внутри моего основного класса Applet, который расширяет ActionListener.
public class AniTimer implements ActionListener {
Element animating;
PieceLoc blank;
int orig_x;
int orig_y;
long timeStart;
int delta;
public AniTimer(Element e, PieceLoc pl) {
animating = e;
blank = pl;
orig_x = animating.x;
orig_y = animating.y;
timeStart = System.currentTimeMillis();
}
public void actionPerformed(ActionEvent evt) {
int dx = (blank.x*piece-orig_x);
int dy = (blank.y*piece-orig_y);
int t = 200;
delta = (int)(System.currentTimeMillis()-timeStart);
if (delta>t) delta=t;
animating.x = orig_x + dx*delta/t;
animating.y = orig_y + dy*delta/t;
repaint();
if (delta==t) {
aniTimer.stop();
animating.updateCA();
board.checkCompleted();
}
}
}
Затем, когда я хочу запустить анимацию, все, что я делаю, - это создаю новый Timer с новым экземпляром моего класса ActionListener в качестве второго аргумента, и я могу передать все жизненно важные аргументы, относящиеся только к этому конкретному этапу анимации, в конструктор .
aniTimer = new Timer(20, new AniTimer(e, board.getBlankPl()));
aniTimer.start();
Спасибо Макс, я начинаю любить Java сейчас!