将多个 JComponent 绘制到一个框架中 [英] Drawing Multiple JComponents to a Frame

查看:21
本文介绍了将多个 JComponent 绘制到一个框架中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在同一个窗口上绘制多个汽车对象,但它们似乎相互覆盖.

I am trying to draw multiple car objects onto the same window but it appears that they are overwriting each other.

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

Here is my overridden paintComponent method in the Car class

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

在我的查看器类中:

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

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

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

虽然坐标好像不一样,但只画了最后一辆车.

Although the coordinates seem to be different, only the last car is being drawn.

有什么建议吗?谢谢

推荐答案

你想要做的是使用 Car 对象的数据结构并在 paintComonent 中循环它们> 方法.类似的东西

What you want to do is use a data structure of Car objects and loop through them in the paintComonent method. Something like

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

drawCar 方法将来自您的 Car

The drawCar method would come from your Car class

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

<小时>

查看更多示例此处此处此处此处此处此处.

更新

这是一个简单的例子,使用了一些Ferraris",也使用了一些动画,但与我上面提到的基本点相同.

Here is a simple example use some "Ferraris" I whipped up, also using some animation, but with the same basic points I have above.

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

这篇关于将多个 JComponent 绘制到一个框架中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆