java - 如何正确执行多线程,使各个线程上的图标一起在屏幕上移动?

标签 java multithreading swing animation paintcomponent

我正在尝试创建一个动画,其中给定数量的图标从框架左侧开始并移动到屏幕右侧。这些图标垂直排列,每个图标都应该在自己的线程上运行。

如何让所有图标执行此操作?我尝试在创建每个赛车手时调整 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();
                }
            }
        }
    }

}

最佳答案

gui.add(racer, BorderLayout.CENTER);

您只能向框架添加一个 Racer 组件。

but so far I can only get the last racer that's created to show.

“racer”变量指向最后创建的 Racer 组件。

如果您想要多个组件,那么您将需要使用空布局创建一个面板。然后您需要将每个 Racer 组件添加到此面板中,然后将面板添加到框架中。使用这种方法,您可以使用组件的 setLocation(...) 方法来移动组件。

如果您想在不同的位置绘制图像,那么您可以使用包含 ArrayList 或 Racer 对象的单个面板。然后,当调用面板的 PaintComponent() 方法时,您将遍历列表并在每个 Racer 的新位置绘制。

关于java - 如何正确执行多线程,使各个线程上的图标一起在屏幕上移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47361911/

相关文章:

java - 如何获取 JLabel 的边框颜色

java - 一次将 CardLayout 中的多张卡片设置为 False

java - 分配布局时出错 : BoxLayout can't be shared

java - gradle.properties是否可以访问环境变量

java - Camel动态路由器修改消息不起作用

Java - List<String> 打印\n 而不是显示换行符

java - CoreData 和 Hibernate 的区别

java - 带有线程池执行器服务的 Vert.x 服务,CPU 使用率高

python - 使用 Celery 抓取网站

java - java线程中的唯一id