1 回答
TA贡献1911条经验 获得超7个赞
您真正想做的第一件事是摆脱您的run方法(以及您对 的依赖Runnable)。这确实是在 Swing 中执行定期更新的一种不合适的方式。
Swing 是单线程的,不是线程安全的,您当前的方法有跨线程边界脏读/写的风险。
相反,您想要使用 Swing Timer,请参阅如何使用 Swing 计时器了解更多详细信息。
接下来要做的是添加一个start方法并更新该stop方法以支持使用 Swing Timer...
public class ControlledBall extends JPanel {
//...
private Timer timer;
public void stop() {
if (timer == null) {
return;
}
timer.stop();
timer = null;
x = 0;
y = 0;
}
public void start() {
if (timer != null) {
return;
}
timer = new Timer(delay, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
move();
repaint();
}
});
timer.start();
}
然后,您只需更新开始和停止按钮即可调用这些方法...
stop.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ball2.stop();
}
});
//...
start.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ball2.start();
}
});
添加回答
举报