我目前正在用Java编程。当用户按下程序的开始按钮时,我想要一个循环开始。但是我希望用户能够使用停止按钮停止循环:
public class Program {
private boolean active;
// MVC stuff...
private class StartListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
// Do stuff...
active = true;
hotelCalifornia();
}
}
private class StopListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
// Do stuff...
active = false;
}
}
public void hotelCalifornia() {
while (this.active) {
// The program never leaves!
}
}
}
但是一旦启动循环,程序只执行循环的动作。有没有解决的办法?有没有更好的方法来实现我的目标?
谢谢!
答案 0 :(得分:4)
首先,您必须以新的Thread
启动循环。
然后,当用户按下stop()
时,请致电thread.interrupt()
在循环内添加:
if (Thread.currentThread().isInterrupted()) {
break;
}
答案 1 :(得分:4)
Java Swing应用程序中的所有事件都在一个事件线程中调用。
你应该创建一个Swing Timer来随意调用你想要的任何方法。
答案 2 :(得分:1)
我建议将while循环中的逻辑放在可运行的
中class basicThread implements Runnable {
public void run() {
while (true) {
// Put the stuff in your while loop here
}
}
}
设置一个线程来执行你的runnable
// Create a thread to execute your runnable
Thread thread = new Thread(new basicThread());
然后在StartListener
中调用以下内容thread.start();
以下StopListener
thread.interrupt()
答案 3 :(得分:1)
有两件事需要考虑。
首先,您要在Event Dispatch Thread中创建一个长时间运行的进程。这是你永远不应该做的事情。正如Nican所指出的,Swing应用程序中的所有GUI事件都将在此线程中调用。当用户按下“开始”按钮时,您的actionPerformed
中的StartListener
将在EDT中被调用。有关Swing Threading的更多信息,请阅读here。
这导致了第二点:您将希望在不同的线程中运行hotelCalifornia
。你可以保留一个参考这个帖子,以便你可以像Bozho指出的那样打电话给thread.interrupt()
。您还可以选择使用自己的实现,但是您需要确保将active
var声明为volatile
,以便新线程可以立即访问布尔值的状态它已更新。
答案 4 :(得分:1)
选项是使用SwingWorker。 如果您不再希望它运行,请在其上调用cancel()方法,并在循环中检查isCancelled()。