2017-11-18 130 views
1

我試圖創建一個動畫,其中給定數量的圖標從框架的左側開始並移動到屏幕的右側。圖標垂直排列,每個圖標應該在自己的線程上運行。如何正確執行多線程以便各個線程上的圖標一起移動到屏幕上?

如何獲取所有圖標來做到這一點?當我創建每個賽車手時,我嘗試調整posY,但到目前爲止,我只能獲得創建的最後一名賽車手來顯示。

import javax.swing.*; 
import java.awt.*; 

public class Races { 
    private JFrame frame; 
    private JPanel gui; 
    private Icon img; 
    private int imgWidth; 
    private int imgHeight; 
    private int numOfRacers; // num of threads/racers 

    public static void main(String[] args) { 
     new Races(5); 
    } 

    public Races(int num) { 
     numOfRacers = num; 
     createGUI(); 
     frame.add(gui); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private void createGUI() { 
     frame = new JFrame("Off to the Races - by Brienna Herold"); 
     gui = new JPanel(); 
     gui.setPreferredSize(new Dimension(imgWidth * 20, imgHeight * numOfRacers)); 

     img = new ImageIcon("races.png"); 
     imgWidth = img.getIconWidth(); 
     imgHeight = img.getIconHeight(); 

     int posY = 0; 
     for (int i = 0; i < numOfRacers; i++) { 
      System.out.println("Starting new thread..." + posY); 
      racer = new Racer(posY); 
      Thread racerThread = new Thread(racer); 
      racerThread.start(); 
      posY += imgHeight; 
     } 
    } 

    protected class Racer extends JPanel implements Runnable { 
     private int lastPosX; 
     private int posX; 
     private int posY; 

     public Racer(int _posY) { 
      posX = 0; 
      posY = _posY; 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      // Call the method on the JPanel 
      super.paintComponent(g); 
      img.paintIcon(gui, g, posX, posY); 
      //posY += imgHeight; 
      posX += lastPosX + 3; 
     } 

     @Override 
     public void run() { 
      while (true) { 
       repaint(); 
       try { 
        Thread.sleep(100); 
       } catch (InterruptedException ex) { 
        ex.printStackTrace(); 
       } 
      } 
     } 
    } 

} 

回答

0
gui.add(racer, BorderLayout.CENTER); 

你永遠只能添加一個賽車部件的框架。

但到目前爲止,我只能得到創建的最後一個賽車手來顯示。

「racer」變量指向創建的最後一個Racer組件。

如果您需要多個組件,那麼您將需要使用空佈局創建一個面板。然後,您需要將每個Racer組件添加到此面板,然後將面板添加到框架。使用這種方法,您將通過使用組件的setLocation(...)方法來移動組件。

如果您想在不同位置繪製圖像,那麼您將使用一個包含ArrayList或Racer對象的面板。然後,當面板的paintComponent()方法被調用時,您遍歷List並在每個Racer的新位置繪製。

+0

哦。讓我試試這個。 – briennakh

+0

不是你不只是繪畫。除非將組件添加到框架,否則無法繪製組件。 – camickr

+0

我現在明白了。我要去研究它。 – briennakh

相關問題