JavaFX:如何将按钮属性绑定到线程状态?

JavaFX:如何将按钮属性绑定到线程状态?,java,multithreading,javafx,javafx-8,observable,Java,Multithreading,Javafx,Javafx 8,Observable,我有一个javafx应用程序,它在单击按钮时启动一个新线程 以下是启动线程的方法: private void startTest() { String[] args = {}; String threadId = TestRunner.class.getSimpleName(); mainApp.setRunner(new Thread(() -> { try { TestRunner.

我有一个javafx应用程序,它在单击按钮时启动一个新线程

以下是启动线程的方法:

private void startTest() {
        String[] args = {};
        String threadId = TestRunner.class.getSimpleName();
        mainApp.setRunner(new Thread(() -> {
            try {
                TestRunner.main(args);
            } catch (Throwable e) {
                LOGGER.fatal(e.getMessage(), e);
            }
        }, threadId));
        mainApp.getRunner().start();
    }
我可以使用
setRunner()
getRunner()
访问器从mainApp获取和设置
Thread
对象

这就是当前发生的情况:
  • 我启动应用程序
  • 我单击按钮
    [开始]
  • 单击后,将启动一个新线程,我将把
    [start]
    按钮的文本更改为
    [PAUSE]
  • 我知道线程将在某个时间点(任务完成时)完成

    我想要实现的目标:
  • 我想在线程完成后/线程死亡时,将now
    [PAUSE]
    按钮的文本更改为
    [START]
  • 其他一些事情取决于线程的状态

    我该怎么做

    我目前正在研究可观察的布尔值,但我需要一些帮助来实现这一点


    提前谢谢

    更改节点内线程的值:

    private void startTest() {
            String[] args = {};
            String threadId = TestRunner.class.getSimpleName();
            mainApp.setRunner(new Thread(() -> {
                try {
                    TestRunner.main(args);
                } catch (Throwable e) {
                    LOGGER.fatal(e.getMessage(), e);
                }
            }, threadId));
            mainApp.getRunner().start();
        }
    
    您有两种选择来做您想做的事情,您可以使用Task类并将您的按钮与任务值的更改绑定,您有updateMessage(“”)和updateValue()或updateTitle,或者您可以在线程内部使用平台类

            Button StartButton=new Button("Start");
            Thread TestThread=new Thread(new Runnable(){
               @Override
               public void run()
                 {
                  Platform.runLater(new Runnable(){
               @Override
               public void run()
                 {
    
                 StartButton.setText("Pause");    
    
    
                 }
                 while(true)
                {
                  }
    
    
                }
             );
            StartButton.addEventHandler(event->{
                 if(StartButton.getText().equals("Start"))
                 {
                  StartThread.start();
                 }else{
                 StartThread.interrupt();  
                  }
    

    使用
    服务
    管理主应用程序中的后台线程(或当前管理
    runner
    属性的任何位置)。比如:

    public class MainApp {
    
        private final Service<Void> testService = new Service<Void>() {
            @Override
            protected Task<Void> createTask() {
                return new Task<Void>() {
                    @Override
                    protected Void call() throws Exception {
                        // code to execute on background thread here:
                        while (! isCancelled() ) {
                            // ...
                        }
                    }
                }
            }
        };
    
        public Service<Void> getTestService() {
            return testService();
        }
    
        // ...
    }
    

    对于如何实现从
    服务
    createTask()
    方法返回的
    任务
    有大量信息和示例。

    这看起来很有希望。我会努力解决这个问题,并尽快接受答案。谢谢这个答案有一半是正确的,但确实有帮助。接受这个答案。谢谢