2017-11-18 7 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); 

あなたは今までのフレームに1つのレーサーコンポーネントを追加します。

しかし、これまでに作成した最後のレーサーしか入手できません。

"racer"変数は、最後に作成されたRacerコンポーネントを指します。

複数のコンポーネントが必要な場合は、nullレイアウトを使用してパネルを作成する必要があります。次に、各Racerコンポーネントをこのパネルに追加し、パネルをフレームに追加する必要があります。この方法を使用すると、コンポーネントのsetLocation(...)メソッドを使用してコンポーネントを移動します。

イメージを別の場所にペイントする場合は、ArrayListオブジェクトまたはRacerオブジェクトを含む単一のパネルを使用します。次に、パネルのpaintComponent()メソッドが呼び出されると、リストを反復して、各Racerを新しい場所にペイントします。

+0

Ooh。私はこれを試してみましょう。 – briennakh

+0

絵画だけではありません。コンポーネントをフレームに追加しない限り、コンポーネントをペイントすることはできません。 – camickr

+0

私は今理解しています。私はそれに取り組むつもりです。 – briennakh

関連する問題