Рисование нескольких JComponents в рамку

Я пытаюсь нарисовать несколько автомобильных объектов в одном окне, но кажется, что они переписывают друг друга.

Вот мой переопределенный метод paintComponent в classе 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); } 

И в моем classе просмотра:

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

Хотя координаты кажутся разными, набирается только последний автомобиль.

Какие-либо предложения? благодаря

    То, что вы хотите сделать, это использовать структуру данных объектов Car и прокручивать их в методе paintComonent . Что-то вроде

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

    Метод drawCar будет drawCar из вашего classа 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 } } 

    См. Больше примеров здесь и здесь, и здесь, и здесь, и здесь, и здесь .


    ОБНОВИТЬ

    Вот простой пример использования некоторых «Феррари», которые я взбивал, также используя некоторую анимацию, но с теми же основными пунктами, которые у меня выше.

    введите описание изображения здесь

     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 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 является BorderLayout. Поэтому по умолчанию вы добавляете все свои компоненты в CENTER of BorderLayout. Однако вы можете добавлять только один компонент в CENTER, чтобы отображался только последний автомобиль.

    Измените диспетчер макетов на FlowLayout, чтобы увидеть разницу.

    Или, похоже, вы пытаетесь рисовать автомобили в случайных позициях, и в этом случае вы должны использовать «нулевой» макет. Тогда вы будете нести ответственность за настройку размера / местоположения каждого из компонентов автомобиля.

    Interesting Posts

    Есть ли способ создать кортеж из списка (без кодирования)?

    Можете ли вы иметь несколько $ (document) .ready (function () {…}); разделы?

    Выделение отфильтрованного результата в AngularJS

    Несколько процессов chrome.exe в диспетчере задач

    Размещение массива-new требует неопределенных накладных расходов в буфере?

    CMake: в каком порядке обрабатываются файлы (кеш, toolchain и т. Д.)?

    Как проверить, существует ли столбец в таблице SQL Server?

    Самый простой способ поддержки нескольких ориентаций? Как загрузить пользовательский NIB, когда приложение находится в Landscape?

    Java: Enum vs. Int

    Обнаружение constexpr с помощью SFINAE

    Альтернативы встроенной утилите checkdisk для Windows NTFS?

    Добавить панель инструментов в нижней части заголовка с помощью jqgrid

    Вызов jQuery Ajax Request Каждый X минут

    Почему это регулярное выражение позволяет каретку?

    «Ошибка загрузки» Сообщение при загрузке с USB-устройства в ноутбуке

    Давайте будем гением компьютера.