如何在JavaFX中使用scren的close(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

我使用以下代码创建一个用户定义的Java线程,并连续执行一些操作。然后,当用户想要关闭窗口并单击窗口的(X)图标时,我想销毁这个线程

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