如何正确执行多线程以便各个线程上的图标一起移动到屏幕上?

如何正确执行多线程以便各个线程上的图标一起移动到屏幕上?

问题描述:

我试图创建一个动画,其中给定数量的图标从框架的左侧开始并移动到屏幕的右侧。图标垂直排列,每个图标应该在自己的线程上运行。如何正确执行多线程以便各个线程上的图标一起移动到屏幕上?

如何获取所有图标来做到这一点?当我创建每个赛车手时,我尝试调整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(); 
       } 
      } 
     } 
    } 

} 

gui.add(racer, BorderLayout.CENTER); 

你永远只能添加一个赛车部件的框架。

但到目前为止,我只能得到创建的最后一个赛车手来显示。

“racer”变量指向创建的最后一个Racer组件。

如果您需要多个组件,那么您将需要使用空布局创建一个面板。然后,您需要将每个Racer组件添加到此面板,然后将面板添加到框架。使用这种方法,您将通过使用组件的setLocation(...)方法来移动组件。

如果您想在不同位置绘制图像,那么您将使用一个包含ArrayList或Racer对象的面板。然后,当面板的paintComponent()方法被调用时,您遍历List并在每个Racer的新位置绘制。

+0

哦。让我试试这个。 – briennakh

+0

不是你不只是绘画。除非将组件添加到框架,否则无法绘制组件。 – camickr

+0

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