如何在JavaFX中使用scren的close(X)图标关闭用户定义的线程?
我使用以下代码创建一个用户定义的Java线程,并连续执行一些操作。然后,当用户想要关闭窗口并单击窗口的(X)图标时,我想销毁这个线程如何在JavaFX中使用scren的close(X)图标关闭用户定义的线程?,java,javafx,Java,Javafx,我使用以下代码创建一个用户定义的Java线程,并连续执行一些操作。然后,当用户想要关闭窗口并单击窗口的(X)图标时,我想销毁这个线程 class Simple { Threa thread; @Override public void initialize(URL url, ResourceBundle rb) { thread = new Thread(new MyThreadClass(this)); thread.sta
class Simple
{
Threa thread;
@Override
public void initialize(URL url, ResourceBundle rb) {
thread = new Thread(new MyThreadClass(this));
thread.start();
}
//code
}//Simple
class MedicalStoreSalesPageControllerThread implements Runnable {
@Override
public void run() {
//Action which is continuously performed
}
}//MedicalStoreSalesPageControllerThread
我说的是窗户右上角的(X)标志
我创建了一个小的exmaple,告诉你怎么做 主要类别:
package sample;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
Parent root = loader.load();
primaryStage.setScene(new Scene(root));
// Get the controller instance
Controller controller = loader.getController();
// Prevent closing when user clicks on the (X) sign at top right corner of window:
primaryStage.setOnCloseRequest(event -> {
event.consume();
controller.closeApp();
});
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
控制器类:
package sample;
import javafx.fxml.Initializable;
import java.net.URL;
import java.util.ResourceBundle;
public class Controller implements Initializable {
private MyTask myTask;
@Override
public void initialize(URL location, ResourceBundle resources) {
myTask = new MyTask();
new Thread(myTask).start();
}
void closeApp() {
// Cancel task and close
if (myTask.cancel())
System.exit(0);
}
}
MyTask类:
package sample;
import javafx.concurrent.Task;
class MyTask extends Task<Void> {
@Override
protected Void call() throws Exception {
while (true) {
System.out.println("running");
Thread.sleep(1000);
}
}
@Override
protected void cancelled() {
System.out.println("stopped");
}
}
包装样品;
导入javafx.concurrent.Task;
类MyTask扩展了任务{
@凌驾
受保护的Void调用()引发异常{
while(true){
System.out.println(“运行”);
睡眠(1000);
}
}
@凌驾
受保护的作废已取消(){
系统输出打印项次(“停止”);
}
}
这将退出应用程序。除了应用程序退出这一事实之外,这对停止线程没有任何作用。在他们的示例中,他们检查“isCancelled”以停止工作,并完成调用方法。如果没有“System.exit”,一切都应该正常,因为当所有窗口关闭时,javafx将退出。此外,你还应该解释一下你对OP的回答。再次玩猜谜游戏;)对于一个糟糕的问题,不可能写出一个好的答案。当用户点击关闭按钮时,他想在应用程序关闭之前做一些事情(停止一些线程)。对我来说,这很简单,(当用户点击关闭按钮时,他想在应用程序关闭之前做一些事情(停止一些线程)@Kleopatra哪一部分你有问题?在窗口关闭时捕获事件,还是停止线程?Your's run方法应检查是否需要继续运行,然后在关闭窗口时更改线程条件。请参阅我的示例:primaryStage.setOnCloseRequest(event->{event.consume();…您的答案非常棒,它确实对我有效。谢谢@anko