java如何创建另一个线程,以便我的ActionListener在运行planet simulation时仍然侦听按钮按下事件?
我有一个JButton,并在其中添加了一个ActionListener
。我还有一个SimulationPanel
类,它扩展了JPanel
,并有一个名为simulationPanel的实例。两者都被添加到JFrame
。在ActionListener
I call simulationPanel.startSimulation()
的actionPerformed方法中
class StartButtonListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent arg0) {
if(mode == MODE_DEFAULT){
mode = MODE_SIMULATING;
startButton.setText("Stop Simulation");
simulationPanel.startSimulation();
} else if(mode == MODE_SIMULATING){
mode = MODE_DEFAULT;
startButton.setText("Start Simulation");
simulationPanel.stopSimulation();
}
}
}
stopSimulation()
方法将running设置为false
public void startSimulation() {
running = true;
long time = System.currentTimeMillis();
long time2 = System.currentTimeMillis();
while(running){
time = System.currentTimeMillis();
if(time - time2 > 1000/60){
for(int i = 0; i < planets.size(); i++) {
planets.get(i).setLocation(planets.get(i).getNewLocation());
}
this.paintImmediately(0, 0, 950, 680);
time2 = System.currentTimeMillis();
}
}
}
这将设置我的行星的新位置,并每隔60秒重新绘制屏幕
问题是,一旦进入while(running)循环,ActionListener
就不再响应被按下的按钮,因此无法调用stopSimulation()
。我该如何创建一个新线程,使按钮能够在模拟运行时做出响应
# 1 楼答案
当然可以,因为你的开始模拟阻塞了你的主线程
我建议您使用Swing Timer http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html