(Java Swing) 我的动画线程不是 运行 并行
(Java Swing) My animating threads are not running parallely
我在这段代码中试图做的是同时移动(动画)图像。但是,只有一个图像在移动,而另一个则静止不动。当我使用 print 命令对此进行检查时,我发现第一个线程是大部分时间运行的唯一线程,而在 for 循环中创建的第二个线程可能只运行了一小部分时间。如果能帮助我解决这个问题并使两个线程并行运行,我将不胜感激。
private static void createPan() {
for(int i = 0; i < listSize; i++) {
//System.out.println("="+i);
ImageList.add(new JLabel(images.getImage()));
ImageList.get(i).setBounds(0,0,10,10);
List.add(new Motion(x,y));
thrdList.add(new Thread(new threadFunc(i)));
//System.out.println(threadList.size());
dispPane.add(ImageList.get(i));
thrdList.get(i).start();
}
}
private static class threadFunc implements Runnable {
private static int indexNo;
private static Timer t = new Timer(10, new AnimationListener(indexNo));
public threadFunc(int index) {
indexNo = index;
}
@Override
public void run() {
//System.out.println("-"+indexNo);
setLocation(indexNo);
System.out.println("end");
}
private static void setLocation(int indexNo) {
// System.out.println("+"+indexNo);
//System.out.println(c + "," + d);
//System.out.println("+"+indexNo);
ImageList.get(indexNo).setBounds(List.get(indexNo).getX(), List.get(indexNo).getY(), 10, 10);
t.start();
}
private static class AnimationListener implements ActionListener {
private static int indexNo;
public AnimationListener(int index) {
indexNo = index;
}
public void actionPerformed(ActionEvent e) {
//System.out.println(indexNo);
//System.out.println("-"+indexNo);
List.get(indexNo).setX(List.get(indexNo).getX()+List.get(indexNo).getVelocityX());
List.get(indexNo).setY(List.get(indexNo).getY()+List.get(indexNo).getVelocityY());
setLocation(indexNo);
}
}
}
private static int indexNo;
private static Timer t = new Timer(10, new AnimationListener(indexNo));
public threadFunc(int index) {
indexNo = index;
}
和
private static class AnimationListener implements ActionListener {
private static int indexNo;
public AnimationListener(int index) {
indexNo = index;
}
不要使用静态变量。
静态变量意味着它由 class 的所有实例共享。因此,当您创建相同 class 的第二个实例时,变量的值将重置为最后一个参数的值。所以你只能在单个对象上获得动画。
不过,我也同意使用单个 Timer 的建议。在此设计中,您保留了一个要设置动画的对象的 ArrayList,然后遍历 ArrayList 以重置每个对象的位置。
有关工作示例,请参阅:。该示例可以处理数百个移动对象。让数百个单独的计时器分别为每个对象设置动画是不切实际的。
我在这段代码中试图做的是同时移动(动画)图像。但是,只有一个图像在移动,而另一个则静止不动。当我使用 print 命令对此进行检查时,我发现第一个线程是大部分时间运行的唯一线程,而在 for 循环中创建的第二个线程可能只运行了一小部分时间。如果能帮助我解决这个问题并使两个线程并行运行,我将不胜感激。
private static void createPan() {
for(int i = 0; i < listSize; i++) {
//System.out.println("="+i);
ImageList.add(new JLabel(images.getImage()));
ImageList.get(i).setBounds(0,0,10,10);
List.add(new Motion(x,y));
thrdList.add(new Thread(new threadFunc(i)));
//System.out.println(threadList.size());
dispPane.add(ImageList.get(i));
thrdList.get(i).start();
}
}
private static class threadFunc implements Runnable {
private static int indexNo;
private static Timer t = new Timer(10, new AnimationListener(indexNo));
public threadFunc(int index) {
indexNo = index;
}
@Override
public void run() {
//System.out.println("-"+indexNo);
setLocation(indexNo);
System.out.println("end");
}
private static void setLocation(int indexNo) {
// System.out.println("+"+indexNo);
//System.out.println(c + "," + d);
//System.out.println("+"+indexNo);
ImageList.get(indexNo).setBounds(List.get(indexNo).getX(), List.get(indexNo).getY(), 10, 10);
t.start();
}
private static class AnimationListener implements ActionListener {
private static int indexNo;
public AnimationListener(int index) {
indexNo = index;
}
public void actionPerformed(ActionEvent e) {
//System.out.println(indexNo);
//System.out.println("-"+indexNo);
List.get(indexNo).setX(List.get(indexNo).getX()+List.get(indexNo).getVelocityX());
List.get(indexNo).setY(List.get(indexNo).getY()+List.get(indexNo).getVelocityY());
setLocation(indexNo);
}
}
}
private static int indexNo;
private static Timer t = new Timer(10, new AnimationListener(indexNo));
public threadFunc(int index) {
indexNo = index;
}
和
private static class AnimationListener implements ActionListener {
private static int indexNo;
public AnimationListener(int index) {
indexNo = index;
}
不要使用静态变量。
静态变量意味着它由 class 的所有实例共享。因此,当您创建相同 class 的第二个实例时,变量的值将重置为最后一个参数的值。所以你只能在单个对象上获得动画。
不过,我也同意使用单个 Timer 的建议。在此设计中,您保留了一个要设置动画的对象的 ArrayList,然后遍历 ArrayList 以重置每个对象的位置。
有关工作示例,请参阅: