2014-03-02 4 views
2

동일한 창에 여러 자동차 개체를 그리려하지만 서로 겹쳐 쓰는 것처럼 보입니다.프레임에 여러 JComponents 그리기

여기 Car 클래스

public void paintComponent(Graphics g) { 
    Graphics2D g2 = (Graphics2D) g; 

    g2.setColor(wheelColor); 
    g2.fill(leftWheel); 
    g2.fill(rightWheel); 
    g2.setColor(bodyColor); 
    g2.fill(body); 
    g2.fill(cab); 
} 

에서 그리고 내 뷰어 클래스 내 오버라이드 (override)의 paintComponent 방법입니다 : 좌표가 다른 것 같다 있지만

JFrame f = new JFrame(); 
initializeFrame(f); 

Car x = new Car(100, 100); 
Car y = new Car(300, 300); 

f.add(x); 
f.add(y); 

, 마지막 차는 그려되고있다.

제안 사항? 감사합니다

답변

12

Car의 데이터 구조를 사용하고이를 paintComonent 방법으로 반복하면됩니다.

List<Car> cars = new ArrayList<>(); 
.... 
@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    for (Car car : cars) { 
     car.drawCar(g); 
    } 
} 

drawCar 방법처럼 뭔가

public class Car { 
    int x, y; 
    public Car(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    public void drawCar(Graphics g) { 
     g.setColor(Color.BLACK); 
     // do everything here as you would in a paintComponent method 
    } 
} 

이 더 많은 예제 herehereherehereherehere를 참조하여 Car 클래스에서 온 것입니다.


UPDATE 여기

간단한 예 I는 어떤 애니메이션을 사용 채찍질 일부 "페라리"를 사용하지만, 동일한 기본 점 I 위에있다.

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 

public class DrawCar extends JPanel{ 
    private static final int D_W = 400; 
    private static final int D_H = 400; 

    List<Car> cars; 
    public DrawCar() { 
     cars = new ArrayList<>(); 
     cars.add(new Car(100, 300)); 
     cars.add(new Car(200, 100)); 

     Timer timer = new Timer(50, new ActionListener(){ 
      public void actionPerformed(ActionEvent e) { 
       for (Car car : cars) { 
        car.move(); 
        repaint(); 
       } 
      } 
     }); 
     timer.start(); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     for (Car car : cars) { 
      car.drawCar(g); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(D_W, D_H); 
    } 

    public class Car { 
     private static final int INCREMENT = 5; 
     int x, y; 
     public Car(int x, int y) { 
      this.x = x; 
      this.y = y; 
     } 
     public void drawCar(Graphics g) { 
      g.setColor(Color.BLUE); 
      g.fillRect(x, y, 100, 30); 
      g.setColor(Color.BLACK); // body 
      g.fillOval(x + 15, y + 20, 15, 15); // wheel 
      g.fillOval(x + 60, y + 20, 15, 15); // wheel 
      g.fillRect(x + 15, y - 20, 60, 20); // top 
     } 

     public void move() { 
      if (x == D_W) { 
       x = 0; 
      } else { 
       x += INCREMENT; 
      } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.add(new DrawCar()); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

감사합니다. 이것은 대단히 도움이되었습니다. :) – MathMajor

+1

내 ** 업데이트 **에서 일부 애니메이션보기 –

+1

글쎄, 당신은 내가 약 10 분 만에 마지막 2 시간 동안 만들려고했던 프로그램을 만들 수 있었다! 와우! 하하, 그리고 감사 :) – MathMajor

5

enter image description here

하지만 서로를 덮어 쓰는 것으로 보인다.

JFrame의 기본 레이아웃 관리자는 BorderLayout입니다. 그래서 기본적으로 모든 컴포넌트를 BorderLayout의 CENTER에 추가합니다. 그러나 CENTER에 하나의 구성 요소 만 추가 할 수 있으므로 마지막 카 만 표시됩니다.

레이아웃 관리자를 FlowLayout으로 변경하여 차이점을 확인하십시오.

또는 자동차를 무작위로 페인트하려고하는 것처럼 보입니다.이 경우 널 (null) 레이아웃을 사용해야합니다. 그런 다음 각 자동차 구성 요소의 크기/위치를 설정해야합니다.

관련 문제