Я пытаюсь сделать очень простую анимацию, где слова из ArrayList перемещаются по экрану.Чтобы сделать это, я использовал метод drawString () и таймер, чтобы изменить позицию x каждый установленный объем мс.Мой метод paintComponent в настоящее время настроен так, чтобы рисовать два разных слова, сначала слово «Hello», а затем слово «World» через 2,5 секунды.
Моя проблема в том, что графическая система координат, кажется, движется, и, в результате, слова, которые я породил после первого «Hello», ведут себя по-разному.Слово «Мир» имеет постоянную х = 0, но оно появляется в середине экрана и также перемещается вместе со словом «Привет».Кроме того, сам розовый фон движется со скоростью, отличной от слов!
Больше всего меня огорчает то, что если я избавлюсь от строк 32-38 (код, который порождает слова),и только установить цвет фона, фон все еще движется.Однако, если я избавлюсь от строки 80 (метод, который меняет x), фон перестает двигаться.Это означает, что определенно существует связь между моим значением x и фоном, но я просто не могу понять, что это такое.
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Word extends JPanel{
private ArrayList<String> phrase;
int x;
private int y;
private int interval;
private Word(ArrayList<String> Phrase,int height,int Interval){
interval = Interval;
y = height;
phrase = Phrase;
this.setBackground(Color.WHITE);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
this.setBackground(Color.MAGENTA);
g.setColor(Color.BLACK);
g.setFont(new Font("TimesRoman", Font.BOLD, 30));
for (int num = 0; num < phrase.size(); num++){
if(num == 2){
g.drawString(phrase.get(num), 0, 100*(num+1));
}else{
g.drawString(phrase.get(num), x, 100*(num + 1));
}
}
}
public void changeX(){
x += 1;
}
public ArrayList<String> getPhrase(){
return phrase;
}
public int getX(){
return x;
}
public int getY(){
return y;
}
public int getInterval(){
return interval;
}
public static void main(String[] args){
final ArrayList<String> words = new ArrayList<String>();
words.add("Hello");
// words.add("World");
final Word test = new Word(words, 100, 50);
final JFrame frame = new JFrame("test");
frame.setSize(800, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setBackground(Color.WHITE);
frame.add(test);
frame.setVisible(true);
Timer testTimer = new Timer();
TimerTask testTask = new TimerTask(){
int counter = 0;
boolean spawned = false;
public void run(){
test.changeX();
frame.repaint();
System.out.println(counter);
if(counter>50 && !spawned){
words.add("World");
spawned = true;
}
counter++;
}
};
testTimer.scheduleAtFixedRate(testTask, 0, test.getInterval());
}
}
Я ожидал, что слово "Мир" появится в самой левой части кадра и останется на месте.