gpt4 book ai didi

Java 与 Swing 同步线程

转载 作者:行者123 更新时间:2023-12-01 18:14:18 24 4
gpt4 key购买 nike

我编写了一个程序,在窗口中显示正在移动的球,并且在接触时以一定的概率相互吸收。

当前版本有效,每次(隐式)调用paintComponent方法时都会计算球的运动:

public class ColliderPanel extends JPanel {
...

@Override
public void paintComponent(Graphics g){
super.paintComponent(g);

// calculate balls's movement
Random r = new Random();
ListIterator<Ball> it = cp.getColliderPanel().balls.listIterator();
Vector<Ball> ballsToRemove = new Vector<Ball>();

while (it.hasNext()) {
Ball b = it.next();
b.move(1.0 / 60.0);
b.collideFrame(cp.getColliderPanel().getSize());

ListIterator<Ball> it2 = cp.getColliderPanel().balls.listIterator(it.nextIndex());
while (it2.hasNext()) {
Ball b2 = it2.next();
if (b.collide(b2)) {
if (r.nextDouble() < 0.5) {
if (b.m > b2.m) {
b.swallow(b2);
ballsToRemove.add(b2);
} else {
b2.swallow(b);
ballsToRemove.add(b);
}
}
}
}
}

cp.getColliderPanel().balls.removeAll(ballsToRemove);

try {
Thread.sleep((long) (1000.0 / 60.0));
} catch (InterruptedException e) {
e.printStackTrace();
}

for(Ball b : balls) b.draw(g);

repaint();
}

...
}

现在我想将球运动的计算外包给第二个线程。我尝试创建另一个类 SimulateBallsMovement 实现 Runnable ,它在重写的 run 方法中进行计算,并在 ColliderPanel 中创建一个新线程,其中具有 SimulateBallsMovement作为可运行对象。

public class ColliderPanel extends JPanel {
private Thread simThread = new Thread(new SimulateBallsMovement());

@Override
public void paintComponent(Graphics g){
super.paintComponent(g);

// calculate balls's movement
// what to to here? how to synchronize the painting and the calculation?

for(Ball b : balls) b.draw(g);

repaint();
}

...
}

我的问题是我不知道如何同步球的绘制和运动计算? ColliderPanel 是否需要 Thread 作为成员?我刚刚找到了有关如何同步调用相同方法的两个线程的教程,但我想在这里做什么?

最佳答案

使用 Swing 时要记住的主要一点是,除了 Swing 事件调度线程 (EDT) 之外,几乎不应该从任何其他线程调用任何 Swing 方法。

EDT 位于一个循环中,等待按键、鼠标单击和其他事件,并在每次发生您的程序感兴趣的事件时调用您的处理程序。

每当任何其他线程想要执行影响 GUI 的操作时,它都应该调用 SwingUtilities.invokeLater(r) 方法,其中 r 是某个 可运行对象。 invokeLater(r) 方法会将包含 r 的事件发布到事件队列,EDT 将通过调用 r.run() 来处理该事件。然后,r.run() 方法可以安全地调用您需要它调用的任何 Swing 方法。

关于Java 与 Swing 同步线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30614743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com