簡體   English   中英

(Java Swing) 我的動畫線程沒有並行運行

[英](Java Swing) My animating threads are not running parallely

我在這段代碼中試圖做的是同時移動(動畫)到圖像。 但是,只有一個圖像在移動,而另一個則保持靜止。 當我使用打印命令對此進行檢查時,我發現第一個線程是大部分時間唯一運行的線程,而在 for 循環中創建的第二個線程可能只運行了一小部分時間。 我真的很感激有關如何解決此問題並使兩個線程 function 並行的幫助。

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

不要使用 static 變量。

static 變量意味着它由 class 的所有實例共享。 因此,當您創建相同 class 的第二個實例時,變量的值將重置為最后一個參數的值。 因此,您只能在單個 object 上獲得 animation。

但是,我也同意使用單個計時器的建議。 在此設計中,您保留要設置動畫的對象的 ArrayList,然后遍歷 ArrayList 以重置每個 object 的位置。

請參閱: 獲取 class 之外的 JPanel 的寬度和高度以獲取工作示例。 該示例可以處理數百個移動對象。 讓數百個單獨的計時器分別為每個 object 設置動畫是不切實際的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM