2017-11-18 19 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 구성 요소를 가리 킵니다.

여러 구성 요소가 필요한 경우 null 레이아웃을 사용하여 패널을 만들어야합니다. 그런 다음이 패널에 각 Racer 구성 요소를 추가 한 다음 프레임에 패널을 추가해야합니다. 이 방법을 사용하면 구성 요소의 setLocation (...) 메서드를 사용하여 구성 요소를 이동할 수 있습니다.

이미지를 다른 위치에 페인팅하려면 ArrayList 또는 Racer 객체가 포함 된 단일 패널을 사용합니다. 그런 다음 패널의 paintComponent() 메서드가 호출되면 List를 반복하고 각 Racer를 새 위치에 페인트합니다.

+0

우. 내가 이것을 시도하자. – briennakh

+0

그냥 그림이 아니란 것은 아닙니다. 구성 요소를 프레임에 추가하지 않으면 구성 요소를 칠할 수 없습니다. – camickr

+0

이제 알겠습니다. 나는 그것에 대해 연구 할 것이다. – briennakh