我正在尝试创建一个动画,其中给定数量的图标从框架左侧开始并移动到屏幕右侧。这些图标垂直排列,每个图标都应该在自己的线程上运行。
如何让所有图标执行此操作?我尝试在创建每个赛车手时调整 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/