(javaswing)我的动画线程没有并行运行

du7egjpx  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(273)

在这段代码中,我要做的是同时移动(动画)到图像。但是,只有一个图像移动,而另一个图像保持静止。当我使用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);
        }
    }
}
8qgya5xd

8qgya5xd1#

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;
    }

不要使用静态变量。
静态变量意味着它被类的所有示例共享。因此,当您创建同一类的第二个示例时,变量的值将重置为最后一个参数的值。所以你只能在一个物体上得到动画。
不过,我也同意使用单一计时器的建议。在这种设计中,您保留了一个要设置动画的对象的arraylist,然后遍历arraylist以重置每个对象的位置。
请参阅:获取类外jpanel的宽度和高度作为工作示例。该示例可以处理数百个移动对象。让数百个单独的计时器分别为每个对象设置动画是不实际的。

相关问题