Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(Java Swing)我的动画线程没有并行运行_Java_Multithreading_Swing_Animation_Runnable - Fatal编程技术网

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

(Java Swing)我的动画线程没有并行运行,java,multithreading,swing,animation,runnable,Java,Multithreading,Swing,Animation,Runnable,在这段代码中,我试图同时将图像移动(设置动画)。但是,只有一个图像移动,而另一个图像保持静止。当我使用print命令对此进行检查时,我发现第一个线程在大部分时间内是唯一运行的线程,而在for循环中创建的第二个线程可能只运行了一小部分时间。对于如何解决这个问题并使两个线程并行运行,我非常感谢您的帮助 private static void createPan() { for(int i = 0; i < listSize; i++) { //System.out.pr

在这段代码中,我试图同时将图像移动(设置动画)。但是,只有一个图像移动,而另一个图像保持静止。当我使用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 void createPan(){
for(int i=0;i

不要使用静态变量

静态变量意味着它由类的所有实例共享。因此,当您创建同一类的第二个实例时,变量的值将重置为最后一个参数的值。因此,只能在单个对象上获得动画

不过,我也同意使用单一计时器的建议。在本设计中,将保留要设置动画的对象的ArrayList,然后在ArrayList中迭代以重置每个对象的位置


请参阅:以获取工作示例。该示例可以处理数百个移动对象。让数百个单独的计时器分别为每个对象设置动画是不现实的。

您介意分享整个CalsConsider吗,Swing不是线程安全的,您不应该尝试从事件调度线程的上下文之外修改UI几乎所有动画应用程序都使用一个且只有一个动画线程来避免此类同步问题。
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;
    }