将多个JComponent绘制到一个框架

我试图将多个汽车物体绘制在同一个窗口上,但看起来它们是互相覆盖的。

这是我在Car类中重写的paintComponent方法

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); } 

在我的Viewer类中:

 JFrame f = new JFrame(); initializeFrame(f); Car x = new Car(100, 100); Car y = new Car(300, 300); f.add(x); f.add(y); 

虽然坐标看起来不一样,但只有最后一辆车正在绘制。

有什么build议么? 谢谢

你想要做的是使用Car对象的数据结构,并在paintComonent方法中遍历它们。 就像是

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

drawCar方法将来自您的Car

 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 } } 

看到更多的例子在这里 , 这里 , 这里 , 这里 , 这里和这里 。


UPDATE

下面是一个简单的例子,使用一些“法拉利”我掀起了,也使用一些animation,但具有上述相同的基本点。

在这里输入图像描述

 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); } }); } } 

但看起来它们是互相覆盖的。

JFrame的默认布局pipe理器是一个BorderLayout。 因此,默认情况下,您将所有组件添加到BorderLayout的中心。 但是,您只能将一个组件添加到CENTER,因此只显示最后一个车辆。

将布局pipe理器更改为FlowLayout以查看差异。

或者,您看起来像是在随机位置绘制汽车,在这种情况下,您应该使用“空白”布局。 然后,您将负责设置每个汽车组件的大小/位置。